网站建设团队扬州/种子在线资源搜索神器
- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
调用约定
调用约定
约定规则
cdecl
stdcall
fastcall
thiscall
调用约定
-
调用约定
-
调用约定(Calling Convention):确定了函数调用时参数传递、返回值处理以及寄存器使用的规则。
-
堆栈(Stack):用于存储函数的参数、返回地址和局部变量。
-
-
约定规则
-
cdecl
-
参数从右到左压入堆栈。
-
调用者负责清理堆栈。
-
#include <iostream>void _cdecl Fun1(int a, int b, int c, int d) {}int main() {// PUSH 4// PUSH 3// PUSH 2// PUSH 1// CALL FUN1// ADD ESP, 0X10Fun1(1, 2, 3, 4);return 0; }
-
-
stdcall
-
参数从右到左压入堆栈。
-
被调用者负责清理堆栈。
-
#include <iostream>void _stdcall Fun1(int a, int b, int c, int d) {// ADD ESP, 0X10// RET 0X10 }int main() {// PUSH 4// PUSH 3// PUSH 2// PUSH 1// CALL FUN1Fun1(1, 2, 3, 4);return 0; }
-
-
fastcall
-
前两个参数通过ECX和EDX寄存器传递,剩余参数从右到左入栈。
-
被调用者负责清理堆栈。
-
#include <iostream>void _fastcall Fun1(int a, int b, int c, int d) {//mov dword ptr[ebp - 14h], edx//mov dword ptr[ebp - 8], ecx//mov dword ptr[ebp - 8], 10h//mov dword ptr[ebp - 14h], 11h//mov dword ptr[ebp + 8], 12h//mov dword ptr[ebp + 0Ch], 13ha = 16;b = 17;c = 18;d = 19;// RET 0X10 }int main() {// PUSH 4 // PUSH 3 // MOV edx,2 // MOV ecx,1 // CALL FUN1Fun1(1, 2, 3, 4);return 0; }
-
-
thiscall
-
常用于C++成员函数。
-
this指针通过ECX寄存器传递。
-
其余参数从右到左入栈。
-
-