masm下幾種常見函數調用方式
masm沒有fastcall調用方式,其特點為:
1 第一個參數放入ecx,第二個參數放入edx;
2 如果有剩餘參數則從右向左壓棧;
3 被調用函數清理棧(平衡棧);
4 若有返回值放入eax;
5 name函數實際生成得函數名為@name@4*參數個數
比如有帶有2個參數的foo函數則實際名稱為:@foo@8
syscall調用方式:
1 不對函數名做任何修飾;
2 從右向左壓棧;
3 被調用函數清理棧;
stdcall調用方式:
1 name函數名實際生成得函數名稱為:_name@4*參數個數;
2 其他與syscall相同;
C調用方式
1 name函數實際名稱為 _name;
2 從右向左壓棧;
3 由調用函數清理棧;
值得注意的是,如果一個函數為 : public syscall foo,其在一個.model為stdcall的文件中,則此代碼無法ml成功。一個解決方法是將所有syscall函數放在一個單獨的.model為syscall的文件中,比如foo函數,然後在.model為stdcall的主文件中引用foo:
foo proto syscall :DWORD,:DWORD
最後用link將2個obj鏈接即可。
最後更新:2017-04-03 05:38:55