第一課: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