匯編中retn 4的含義詳析


retn 4

是個函數返回指令。

以前一直糾結這個retn的寄存器操作順序,手頭正好在調試,詳細跟了一下,豁然開朗,特分享。
先假設個環境:
retn 4未執行時,ESP=0013feb8;EIP=5d1d8b97;而[0013feb8]=7c974a19


執行retn 4之后:

首先
EIP=[0013feb8]
:即此時cpu先指揮EIP獲取到棧中0013feb8起4個字節的值7c974a19,作為retn跳轉的目標,然后cpu跳過去等着執行7c974a19地址下的命令。
此時,EIP=7c974a19

然后

因為retn 4里面有個4,此時cpu才讓ESP棧+4+4,使得ESP=0013fec0。

為啥出現兩個+4?另一個+4的原因在於:如果命令是retn,而不是retn 4,那ESP將當前值(0013feb8)給了EIP之后,自動會來一個+4,即ESP會為0013febc。

總結下來:

retn操作:先eip=esp,然后esp=esp+4

retn N操作:先eip=esp,然后esp=esp+4+N

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM