函數調用約定:是對函數調用時參數如何傳遞的一種約定。調用函數先把參數壓入棧然後再傳遞給函數。棧就是定義在程序中的一段記憶體空間。向下(低位址方向)擴充。且其大小被記錄在PE頭中。也就是說,程序運作時确定占記憶體的大小。
函數執行完成後,棧中的參數如何處理? 不處理。
函數執行完畢後,ESP值如何變化? 恢複到調用之前。
調用約定分三種 cdecl/stdcall/fastcall
cdecl:調用者負責處理棧
VS2015 C++ 控制台程式 預設是cdecl
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
DWORD Add(DWORD dwNumberFirst ,DWORD dwNumberSecond) {
return dwNumberFirst + dwNumberSecond;
}
int main(){
DWORD dwSum = Add(1 ,2);
cout << dwSum << endl;
getchar();
return 0;
}
ADD函數(被調用函數)
MAIN函數(調用函數)
Stdcall:被調用者負責處理棧
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
DWORD _stdcall Add(DWORD dwNumberFirst ,DWORD dwNumberSecond) {
return dwNumberFirst + dwNumberSecond;
}
int main(){
DWORD dwSum = Add(1 ,2);
cout << dwSum << endl;
getchar();
return 0;
}
ADD函數(被調用函數)
MAIN函數(調用函數)
雖然Win32API是使用C語言寫的庫,但它使用的是stdcall方式,而不是C語言預設的cdecl方式。這是為了獲得更好的相容性,使C語言之外的其他語言也能直接調用API。