使用內聯彙編實現函數調用

在實現之前需要熟悉彙編和堆棧的知識才行,否則可能無法理解;

首先輸說一下函數的幾種調用方式,常見的三種有:

1.__cdecl 參數從右至左入棧 調用者清理棧(外平棧);

2.__stdcall 參數從右至左入棧 自身清理堆棧(內平棧);

3.__fastcall ecx和edx傳送前兩個參數,剩下的參數從右至左入棧 自身清理堆棧,如果參數<=兩個

則不用平衡堆棧,因爲參數在寄存器裏;

在瞭解之後,就可以寫代碼了,

//使用內聯彙編編寫函數
int __fastcall add(int a,int b) {
    __asm {
        mov eax,ecx;第一個參數在ecx
        add eax,edx;第二個參數在edx
    }
}

void main()
{
    int res;
    __asm {
        mov ecx, 11;傳遞第一個參數
        mov edx, 22;傳遞第二個參數
        call add;調用函數add
        mov dword ptr[res], eax;從eax中取結果
    }
    printf("res=%d\n",res);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章