閱讀815 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 關於masm中PTR偽指令的一點思考
  下一篇:go masm6.11的BUG?