1. 程式人生 > >函式的呼叫約定

函式的呼叫約定

函式的呼叫約定

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位元組     由臨時量帶出來