ESP,EBP 汇编关于参数的传递


参考了罗云斌的一篇文章,很清晰

http://net.pku.edu.cn/~course/cs201/2004/Assembly/%BB%E3%B1%E0%D6%D0%B2%CE%CA%FD%B5%C4%B4%AB%B5%DD%BA%CD%B6%D1%D5%BB%D0%DE%D5%FD.htm

子程序如何存取参数:

因为缺省对堆栈操作的寄存器有 ESP 和 EBP,而 ESP是堆栈指针,无法暂借使用,所以一般使用 EBP 来存取堆栈,假定在一个调用中有两个参数,而且在 push 第一个参数前的堆栈指针 ESP 为 X,那么压入两个参数后的 ESP 为 X-8,程序开始执行 call 指令,call 指令把返回地址压入堆栈,这时候 ESP 为 X-C,这时已经在子程序中了,我们可以开始使用 EBP 来存取参数了,但为了在返回时恢复 EBP 的值,我们还是再需要一句 push ebp 来先保存 EBP 的值,这时 ESP 为 X-10,再执行一句 mov ebp,esp,根据上图可以看出,实际上这时候 [ebp + 8] 就是参数1,[ebp + c]就是参数2。另外,局部变量也是定义在堆栈中的,它们的位置一般放在 push ebp 保存的 EBP 数值的后面,局部变量1、2对应的地址分别是 [ebp-4]、[ebp-8]。

使用一个简单的程序测试一下,调试,查看汇编代码:

打开寄存器,和内存窗口:

 

 

关于MOV EDI, EDI基本可以忽略,详细参见:

http://www.cppblog.com/sleepwom/archive/2009/04/01/78541.html


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM