Linux下的stdcall 約定格式

2021-08-21 21:45:54 字數 1376 閱讀 3557

windows下的呼叫約定可以是stdcall/cdecl/fastcall,這些標識加在函式名前面,如:

int __stdcall funca()

但在linux下,如按照上面寫法後,編譯程式將導致編譯錯誤,linux下正確的語法如下:

int __attribute__((__stdcall__)) funca()

int __attribute__((__cdecl__)) funca()

linux下如果函式不指定呼叫約定,預設的情況應該是__attribute__((__cdecl__))

int __attribute__((__cdecl__)) myfunc(int i, int j, int k)

080483d0 :

80483d0:    55                       push   %ebp

80483d1:    89 e5                    mov    %esp,%ebp

80483d3:    8b 45 0c                 mov    0xc(%ebp),%eax

80483d6:    03 45 08                 add    0x8(%ebp),%eax

80483d9:    03 45 10                 add    0x10(%ebp),%eax

80483dc:    5d                       pop    %ebp

80483dd:    c3                       ret    

80483de:    66 90                    xchg   %ax,%ax

int __attribute__((__stdcall__)) myfunc(int i, int j, int k)

080483d0 :

80483d0:    55                       push   %ebp

80483d1:    89 e5                    mov    %esp,%ebp

80483d3:    8b 45 0c                 mov    0xc(%ebp),%eax

80483d6:    03 45 08                 add    0x8(%ebp),%eax

80483d9:    03 45 10                 add    0x10(%ebp),%eax

80483dc:    5d                       pop    %ebp

80483dd:    c2 0c 00                 ret    $0xc

stdcall 與 cdecl 的區別

stdcall 與 cdecl 的區別 幾乎我們寫的每乙個windows api函式都是 stdcall型別的,首先,需要了解兩者之間的區別 windows的函式呼叫時需要用到棧 stack,一種先入後出的儲存結構 當函式呼叫完成後,棧需要清除,這裡就是問題的關鍵,如何清除?如果我們的函式使用了 c...

stdcall 與 cdecl 的區別

幾乎我們寫的每乙個windows api函式都是 stdcall型別的,首先,需要了解兩者之間的區別 windows的函式呼叫時需要用到棧 stack,一種先入後出的儲存結構 當函式呼叫完成後,棧需要清除,這裡就是問題的關鍵,如何清除?如果我們的函式使用了 cdecl,那麼棧的清除工作是由呼叫者,用...

cdecl和 stdcall的區別

1 cdecl和 stdcall的區別 1 cdecl呼叫按照從右往左的順序將引數入站,由呼叫者把引數彈出棧 stdcall呼叫按照從右往左的順序將引數入站 由被呼叫者把引數彈出棧 2 stdcall 和 cdecl對函式名最終生成符號的方式不同 stdcall呼叫約定在輸出函式名前加下劃線,後面為...