Delphi fastcall -> gcc stdcall

Тема в разделе "WASM.BEGINNERS", создана пользователем bordo, 3 сен 2009.

  1. bordo

    bordo New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2009
    Сообщения:
    1
    Привет всем!
    Была у меня проблема с dll для Delphi, которая благополучно разрешилась под VC++, но никак не решается под gcc-mingw.

    Код (Text):
    1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
    2. ;;;;; заглушка для отбрасывания результата
    3. PUBLIC  ?workfunc_noreturn@@YIXPAUHWND__@@@Z                ; workfunc_noreturn
    4. EXTRN   _workfunc:PROC
    5. EXTRN   __RTC_CheckEsp:PROC
    6. EXTRN   __RTC_Shutdown:PROC
    7. EXTRN   __RTC_InitBase:PROC
    8. ;   COMDAT rtc$TMZ
    9. rtc$TMZ SEGMENT
    10. __RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
    11. rtc$TMZ ENDS
    12. ;   COMDAT rtc$IMZ
    13. rtc$IMZ SEGMENT
    14. __RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
    15. ; Function compile flags: /Odtp /RTCsu
    16. rtc$IMZ ENDS
    17. _TEXT   SEGMENT
    18. _parent$ = -4                       ; size = 4
    19. ?workfunc_noreturn@@YIXPAUHWND__@@@Z PROC               ; workfunc_noreturn
    20. ; _parent$ = ecx
    21. ; 10   : void __fastcall workfunc_noreturn(HWND parent) {
    22.  
    23.     push    ebp
    24.     mov ebp, esp
    25.     push    ecx
    26.     mov DWORD PTR [ebp-4], -858993460       ; ccccccccH
    27.     mov DWORD PTR _parent$[ebp], ecx
    28.  
    29. ; 11   :    workfunc(parent);
    30.  
    31.     mov eax, DWORD PTR _parent$[ebp]
    32.     push    eax
    33.     call    _workfunc
    34.     add esp, 4
    35.  
    36. ; 12   : }
    37.  
    38.     add esp, 4
    39.     cmp ebp, esp
    40.     call    __RTC_CheckEsp
    41.     mov esp, ebp
    42.     pop ebp
    43.     ret 0
    44. _TEXT   ENDS
    45.  
    46. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
    47. ;;;; proxy-функция для преобразования из Delphi-fastcall в MS-fastcall
    48.  
    49. PUBLIC  @proxyfunc@0
    50. _TEXT   SEGMENT
    51. @proxyfunc@0    PROC
    52.  
    53. ; 18   :     __asm {
    54. ; 19   :         mov   ecx,eax
    55.     mov ecx, eax
    56.  
    57. ; 20   :        // вызываем рабочую функцию из asm-кода
    58. ; 21   :         jmp  workfunc_noreturn
    59.  
    60.     jmp ?workfunc_noreturn@@YIXPAUHWND__@@@Z            ; wf
    61. @proxyfunc@0    ENDP
    62. _TEXT   ENDS
    Я перевёл этот код в GAS:
    Код (Text):
    1. .globl _workfunc_noreturn
    2. _workfunc_noreturn:
    3.  
    4. ///    push ebp
    5.     pushl   %ebp
    6. ///    mov  ebp, esp
    7.     movl    %esp, %ebp
    8.  
    9. ///    push ecx
    10.     pushl   %ecx
    11.  
    12. ///    mov  DWORD PTR [ebp-4], -858993460       ; ccccccccH
    13.     movl    $-858993460,  -4(%ebp)
    14. ///    mov  DWORD PTR _parent$[ebp], ecx
    15.     movl    %ecx,   -4(%ebp)
    16.  
    17. ///    mov  eax, DWORD PTR _parent$[ebp]
    18.        movl -4(%ebp), %eax
    19. ///    push eax
    20.        pushl %eax
    21. ///    call _workfunc
    22.        call _workfunc
    23.  
    24. ///    add  esp, 4
    25.     addl $4, %esp
    26.  
    27. ///    add  esp, 4
    28.     addl $4, %esp
    29. ///    cmp  ebp, esp
    30.     cmpl    %esp,   %ebp
    31.  
    32. ///    call __RTC_CheckEsp
    33. // Skipped VC++ debug check
    34.  
    35. ///    mov  esp, ebp
    36.     movl    %ebp,   %esp
    37.  
    38. ///    pop  ebp
    39. ///    ret  0
    40.     popl %ebp
    41.     ret
    42.  
    43. ////////////////////////////
    44. ///PUBLIC   @proxyfunc@0
    45. .globl _proxyfunc
    46. _proxyfunc:
    47. /// mov ecx, eax
    48.     movl %eax, %ecx
    49.  
    50. /// jmp ?workfunc_noreturn@@YIXPAUHWND__@@@Z            ; wf
    51.     jmp workfunc_noreturn
    Но этот код не работает :dntknw: Помогите разобраться, а то глаза уже на лоб лезут.