1、要先保护现场
2、将参数按照调用约定,存放在被运行桟帧上, 这样, 这个桟帧的帧顶指针就会发生改变
3、若有必要,调用函数会配置一个帧指针,保存调用方希望保持不变的内容(寄存器值)
4、被调用函数为它可能需要的任何局部变分配空间,需要桟帧栈顶向上(-操作)开辟
5、被调用函数返回值存放在eax寄存器中,或者存放在可以立即被调用到的地方
6、一旦函数完成其他操作,任何局部变量都释放了
7、调用地方,如果重新获得控制权,删除在桟开辟的空间(+操作)
C语言调用约定: _cdecl(参数从右想做依次入栈),清理方式,调用者清理
参数入栈原因:对于参数是可变化的,比如函数:printf(“xxxx”), 调用者肯定知道传入被调用者 printf函数的参数,但是,对于函数printf函数本身是不知道调用者传入的参具体是什么。
比如:函数
void demo(int x, int y, int z)
参数反汇编出来的伪代码大致为:
push x
push y
push z
call demo
add esp, 16
上面的 汇编伪代码中:call demo, 就是进入函数 demo(),开始执行了。
add esp 16, 这个 16 = 4 * sizeof (int)。
标准调用 _stdcall
参数入栈方式:从右到左。
使用_stallcall , 不用对桟帧进行参数管理,调用者进行桟帧维护。
DLL 调用的方式就是 _stdcall
void demo(int x, int y, int z)
参数反汇编出来的伪代码大致为:
push x
push y
push z
call demo
ret 16
快速调用 _fastcall
前两个函数将会被分配给 ECX, EDX。
void demo(int x, int y, int z)
ecx = x, edx = y;
剩下的参数都被按照 _stdcall 调用约定入栈
c++调用约定
使用this指针(c++独有)
VC提供了迪this'll调用,将this传递给ecx
gc++调用约定
参数被当做静态,存放在栈顶
教程下载链接(若发现不能下载,请及时留言,第一时间处理):
http://pan.baidu.com/s/1qWXD4Na