stdcall调用约定
Stdcall调用约定是Win32系统下的标准调用方式,Stdcall的参数入栈是从右往左依次入栈,而平衡栈的工作是在被调用函数中完成的。
假设有三个参数,调用方式为func(param1, param2, param3); 反汇编的形式如下:
push param3
push param2
push param1
call func
CALL指令完成的工作为push retAddr/Jmp func,也就是将CALL后面的一条指令的地址入栈,然后跳转到被调用函数处。
跳转到被调用函数后,函数的入口通常为
push ebp
mov ebp, esp
sub esp, xx
首先保存前栈帧的ebp,然后为当前将ebp指向当前栈帧的栈底,最后在栈中开辟临时空间,也就是抬高栈顶。
函数返回时,函数的出口通常为
mov esp, ebp 或者add esp, xx
pop ebp
retn
mov esp, ebp和add esp, xx完成的功能是相同的,但是前者比后者的机器指令要短一个字节,这里是回收栈帧。
pop ebp是恢复上一个栈帧的栈底指针
retn是返回上一个函数。retn将返回地址,也就是前面的retAddr赋值给EIP,然后平衡栈,这时CPU就可以接着调用函数的位置处继续执行了。
补充:综合编程 , 其他综合 ,