第一课:ret和call指令


第一课感觉没什么内容,回答一下课后习题吧。文字描述评论区已经很多了,于是我决定在看一下这两个指令是否真的实现了评论中所说的功能。

调试环境为 visual studio 2019。

 

1.call

 

在执行 call 指令之前,RSP = 0xE69635E920 ,记住了下一条指令 是B490 ,等下栈顶存放的地址就是这个地址。

 

执行 call 指令之后,首先对下一条指令进行入栈,接下来跳转到调用的函数的入口地址。可以看到ESP地址减少了 8 个字节,

这 8 个字节存放了下一条指令的地址

 

在内存框里看一下,确实是这个地址B490:

 

 

 

 

 妙啊,评论区诚不欺我。

 2.ret

接下来看一下ret指令, 这个指令执行之前先进行一系列的出栈,我们可以看到在ret指令之前,RSP的值已经恢复到了之前调用 call 指令

时压栈后时的值,且存储的地址也是之前保存的IP地址。

 

 

 

 

 

 

执行完ret之后,IP地址指向call的下一条指令,RSP也恢复到了调用函数之前的值。

 

 如此这般,就完成了一次函数从调用到返回的全部过程

 


免责声明!

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



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