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呼叫約定在輸出函式名前加下劃線,後面為...