stdcall调用约定

来源:互联网 发布:域名冲突怎么解决 编辑:程序博客网 时间:2024/05/17 02:21
       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就可以接着调用函数的位置处继续执行了。
原创粉丝点击