__cdecl
- 参数入栈 : 从右向左依次入栈栈
- 堆栈清理 : 由调用者清理堆栈
代码示例
-
调用示例
//函数调用 Fun(1,2,3,4); PUSH 4 //从右向左依次入栈 PUSH 3 PUSH 2 PUSH 1 CALL Fun //调用函数 ADD ESP,0X10 //调用者清理堆栈
-
函数内部示例
int __cdecl Fun(int a,int b,int c,int d) { int f = a+b+c+d; return f; } PUSH EBP //保存旧的栈底 MOV EBP,ESP //设置新的栈底 SUB ESP,0X40 //开辟缓冲区 PUSH EBX //保存易变寄存器 PUSH ESI PUSH EDI LEA EDI,DWORD PTR DS:[ESP-0X40] //填充缓冲区 MOV EAX,0XCCCCCCCC MOV ECX,0X10 REP STOSD MOV EAX,DWORD PTR DS:[EBP + 0X8] int f = a+b+c+d; ADD EAX,DWORD PTR DS:[EBP + 0XC] ADD EAX,DWORD PTR DS:[EBP + 0X10] ADD EAX,DWORD PTR DS:[EBP + 0X14] MOV DWORD PTR DS:[EBP - 0X4],EAX MOV EAX,DWORD PTR DS:[EBP - 0X4] ret f POP EDI //恢复易变寄存器 POP ESI POP EBX MOV ESP,EBP //降低栈顶 PUSH EBP //恢复旧的栈底 RET //返回
__stdcall
- 参数入栈 : 从右向左依次入栈栈
- 堆栈清理 : 函数内部清理堆栈
代码示例
-
调用示例
//函数调用 Fun(1,2,3,4); PUSH 4 //从右向左依次入栈 PUSH 3 PUSH 2 PUSH 1 CALL Fun //调用函数
-
函数内部示例
int __stdcall Fun(int a,int b,int c,int d) { int f = a+b+c+d; return f; } PUSH EBP //保存旧的栈底 MOV EBP,ESP //设置新的栈底 SUB ESP,0X40 //开辟缓冲区 PUSH EBX //保存易变寄存器 PUSH ESI PUSH EDI LEA EDI,DWORD PTR DS:[ESP-0X40] //填充缓冲区 MOV EAX,0XCCCCCCCC MOV ECX,0X10 REP STOSD MOV EAX,DWORD PTR DS:[EBP + 0X8] int f = a+b+c+d; ADD EAX,DWORD PTR DS:[EBP + 0XC] ADD EAX,DWORD PTR DS:[EBP + 0X10] ADD EAX,DWORD PTR DS:[EBP + 0X14] MOV DWORD PTR DS:[EBP - 0X4],EAX MOV EAX,DWORD PTR DS:[EBP - 0X4] ret f POP EDI //恢复易变寄存器 POP ESI POP EBX MOV ESP,EBP //降低栈顶 PUSH EBP //恢复旧的栈底 RET 0x10 //返回 并 清理堆栈
__fastcall
- 参数入栈 : 左侧两个参数依次保存在ECX和EDX寄存器,剩余的从右向左依次压入堆栈
- 堆栈清理 : 函数内部清理堆栈
代码示例
-
调用示例
//函数调用 Fun(1,2,3,4); PUSH 0X4 //第四,第三参数依次压入堆栈 PUSH 0X3 MOV EDX,0X2 //第二个参数保存在EDX寄存器 MOV ECX,0X1 //第一个参数保存在ECX寄存器 CALL Fun //函数调用
-
函数内部
int __fastcall Fun(int a,int b,int c,int d) { int f = a+b+c+d; return f; } PUSH EBP //保存旧的栈底 MOV EBP,ESP //设置新的栈底 SUB ESP,0X40 //开辟缓冲区 PUSH EBX //保存易变寄存器 PUSH ESI PUSH EDI PUSH ECX //保存第一个参数的备份 LEA EDI,DWORD PTR DS:[EBP - 0X40] //填充缓冲区 MOV EAX,0XCCCCCCCC MOV ECX,0X10 REP STOSD POP ECX //恢复第一个参数的备份 MOV DWORD PTR DS:[EBP - 0X8],EDX //存储第二个参数的值 MOV DWORD PTR DS:[EBP - 0X4],ECX //存储第一个参数的值 MOV EAX,DWORD PTR DS:[EBP - 0X4] //int f = a + b + c + d; ADD EAX,DWORD PTR DS:[EBP - 0X8] ADD EAX,DWORD PTR DS:[EBP + 0Xc] ADD EAX,DWORD PTR DS:[EBP + 0X10] MOV DWORD PTR DS:[EBP - 0XC],EAX MOV EAX,DWORD PTR DS:[EBP - 0XC] //return d; POP EDI //恢复易变寄存器 POP ESI POP ECX MOV ESP,EBP //降低栈顶 PUSH EBP //恢复旧的栈底 RET 0X8 //返回 并 清楚堆栈