第一课: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也恢复到了调用函数之前的值。

 

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

 

posted @ 2021-11-15 11:05  一只吃水饺的胡桃夹子  阅读(576)  评论(0编辑  收藏  举报