00D21020 >/$ 55 push ebp
00D21021 |. 8BEC mov ebp,esp
00D21023 |. 83EC 08 sub esp,0x8
00D21026 |. 8955 F8 mov dword ptr ss:[ebp-0x8],edx
00D21029 |. 894D FC mov dword ptr ss:[ebp-0x4],ecx
00D2102C |. 8B45 FC mov eax,dword ptr ss:[ebp-0x4] ; fastcall.00D210A5
00D2102F |. 0345 F8 add eax,dword ptr ss:[ebp-0x8]
00D21032 |. 8BE5 mov esp,ebp
00D21034 |. 5D pop ebp ; 001AF888
00D21035 \. C3 retn
和stdcall cdelc相比 fastcall直接课 在call调用完成后堆栈直接平衡完成了,不采用调用者来处理了
接下来然后来总结下
// fastcall.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
int __cdecl add1(int a,int b)
{
return a+b;
}
int __stdcall add2(int a,int b)
{
return a+b;
}
int __fastcall add3(int a,int b)
{
return a+b;
}
int __fastcall add3(int a,int b,int c,int d,int e)
{
return a+b+c+d+e;
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("begin\n");
add1(1,2);
add2(1,2);
add3(1,2);
add3(1,2,3,4,5);
return 0;
}
配置属性--> 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
网友评论