知识点:
cdecl 函数调用约定
stdcall 函数调用约定
CALL堆栈平衡
配置属性--> c/c++ -->高级-->调用约定
一、cdecl调用约定
VC++默认约定__cdecl
1、源代码
int __cdecl add1(int a,int b)
{
return a+b;
}
2、生成汇编代码
00401000 /$ 55 PUSH EBP
00401001 |. 8BEC MOV EBP,ESP
00401003 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00401006 |. 0345 0C ADD EAX,DWORD PTR SS:[EBP+C]
00401009 |. 5D POP EBP
0040100A \. C3 RETN ; POP EIP
3、调用代码
push b
push a
call add1
add esp,8
00401031 |. 6A 02 PUSH 2 ; 0012FF7C
00401033 |. 6A 01 PUSH 1
00401035 |. E8 C6FFFFFF CALL stdcall_.00401000 ; __cdecl add1
0040103A |. 83C4 08 ADD ESP,8 ; RETN 8
二、stdcall调用约定
API函数约定 __stdcall
1、源代码
int __stdcall add2(int a,int b)
{
return a+b;
}
2、生成汇编代码
00401010 /$ 55 PUSH EBP
00401011 |. 8BEC MOV EBP,ESP
00401013 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00401016 |. 0345 0C ADD EAX,DWORD PTR SS:[EBP+C]
00401019 |. 5D POP EBP
0040101A \. C2 0800 RETN 8 ; RETN 8 //ADD ESP,8
3、调用代码
push b
push a
call add2
0040103D |. 6A 04 PUSH 4 ; 0012FF7C
0040103F |. 6A 03 PUSH 3
00401041 |. E8 CAFFFFFF CALL stdcall_.00401010 ; __stdcall add2 PUSH 下一个EIP
三、fastcall 函数调用约定
直接用寄存器传递参数,由于寄存器相对于栈(存储器)速度要快上许多,所以这类的调用约定叫fastcall
1、源代码
int __fastcall add2(int a,int b)
{
return a+b;
}
2、汇编代码
00401020 /$ 55 PUSH EBP
00401021 |. 8BEC MOV EBP,ESP
00401023 |. 83EC 08 SUB ESP,8 ; int a,b;
00401026 |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX ; b=edx
00401029 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX ; a=ecx
0040102C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040102F |. 0345 F8 ADD EAX,DWORD PTR SS:[EBP-8]
00401032 |. 8BE5 MOV ESP,EBP ; add esp,8
00401034 |. 5D POP EBP
00401035 \. C3 RETN
3、调用代码
00401096 |. BA 02000000 MOV EDX,2
0040109B |. B9 01000000 MOV ECX,1
004010A0 |. E8 7BFFFFFF CALL fastcall.00401020 ; 3
原文链接: https://www.cnblogs.com/whzym111/p/6366111.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/248706
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!