当前位置:编程学习 > 网站相关 >>

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就可以接着调用函数的位置处继续执行了。
补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,