1.__cdecl:c 和c++ 程式的預設呼叫規範。
2.__stdcall:標準呼叫約定(即winapi呼叫約定),也就是pascal呼叫約定。
3.delphi就是採用__stdcall約定,所以在呼叫和c程式的動態庫時就會出現因為函式名稱改編問題導致找不到函式名的問題。
4.函式呼叫約定的作用:
1).指定函式在被呼叫時形參的壓棧順序(__cdecl和__stdcall都是採用從右到左的形參壓棧順序),以及指定函式呼叫結束形參出棧順序(__cdecl由呼叫方把引數彈出棧;__stdcall函式體在返回前把引數彈出棧)。
2).函式名改編(新增修飾)約定:__cdecl和__stdcall生成的函式修飾名機制不一樣。
5.__cdecl:可通過在前面加上 extern 「c」以去除函式名修飾。也可通過 .def 檔案去除函式名修飾。注:__cdecl呼叫方式在沒有指定extern 「c」時會改編函式名。
6.__stdcall:好像只能通過 .def 檔案去除函式名修飾。注:__stdcall呼叫方式不管是否指定extern 「c」都會改編函式名,只不過在指定了extern 「c」後改編的函式名更短而與。
7.關於程式編譯時函式改名相關。以函式 int add(int a,int b) 為例
1).__cdecl(預設呼叫規範):?
add@@yahhh
@z 函式名被改編了。
l 分析:?函式名開頭;@z函式名結束;@@ya表示__cdecl呼叫方式;hhh三個h
中第乙個表示返回型別,第二個指第一形參型別,第三個指第二個形參型別,以此類推。
2).extern 「c」 __cdecl:add 函式名沒有改編。
3).__stdcall(標準呼叫規範):?
add@@yghhh
@z 函式名被改編了。
l 分析:?函式名開頭;@z函式名結束;@@yg表示__stdcall呼叫方式;hhh三個h
中第乙個表示返回型別,第二個指第一形參型別,第三個指第二個形參型別,以此類推。
4).extern 「c」 __ stdcall:_add@8 函式名被改編了。
分析:_函式開始;@
形參位元組開始;
8表示形參有
8個位元組。
函式呼叫約定與相關指令
函式呼叫約定與相關指令 函式呼叫約定描述了函式傳遞引數方式和棧協同工作的技術細節。不同的作業系統 不同的語言 不同的編譯器在實現函式呼叫時的原理雖然基本相同,但具體的呼叫約定還是有差別的。這包括引數傳遞方式,引數入棧順序是從右向左還是從左向右,函式返回時恢復堆疊平衡的操作在子函式中進行還是在母函式中...
函式呼叫約定
函式呼叫約定有多種,這裡簡單說一下 1 stdcall 呼叫約定相當於16位動態庫中經常使用的 pascal 呼叫約定。在32位的vc 5.0中pascal呼叫約定不再被支援 實際上它已被定義為 stdcall。除了 pascal外,fortran和 syscall也不被支援 取而代之的是 stdc...
函式呼叫約定
函式呼叫約定1.stdcall是pascal程式的預設呼叫方式,通常用於win32 api中,函式採用從右到左的壓棧方式,自己在退出時清空堆疊。vc將函式編譯後會在函式名前面加上下劃線字首,在函式名後加上 和引數的位元組數。2 c呼叫約定 即用 cdecl關鍵字說明 按從右至左的順序壓引數入棧,由呼...