函式的呼叫約定
阿新 • • 發佈:2018-12-06
函式的呼叫約定
1、_cdecl C標準呼叫約定
2、_stdcall windows標準呼叫約定
3、_fastcall 快讀呼叫約定
4、_thiscall 成員方法呼叫約定(本次不做詳解)
那麼函式的呼叫約定約定了哪些東西呢?
1、函式符號的生成。
2、實參的入棧順序。
3、形參的開闢和清理方式。
實參的入棧順序:
1、_cdecl:由右向左入棧。
2、_stdcall:由右向左入棧。
3、_fastcall:左邊開始的兩個不大於4位元組(DWORD)的引數分別放在ECX和EDX暫存器,其餘的引數仍舊自右向左壓棧傳送。
形參的開闢和清除方式:
1、_cdecl:由呼叫方開闢,函式呼叫結束後由函式呼叫者清除棧內資料。
2、_stdcall:由呼叫方開闢,函式呼叫結束後由被呼叫函式清除棧內資料。
3、_fastcall:最多使用兩個暫存器來帶入實參,其他引數與_stdcall呼叫約定的處理方式一樣,即函式呼叫結束後由被呼叫函式清除棧內資料。
呼叫過程:
1、形參的初始化
2、壓入下一行指令地址
3、壓入呼叫方的棧底指標暫存器的值
4、移動ebp到被呼叫方棧底
5、開闢區域性變數活動需要的棧空間,並初始化為cccc cccc。
返回值的返回方式
非類型別:
1、0位元組 < 返回值 =< 4位元組 eax暫存器帶出
2、4位元組 < 返回值 =< 8位元組 eax和edx暫存器帶出
3、返回值 > 8位元組 由臨時量帶出來