堆棧 pop push


1.什么是堆棧

1.1堆棧

 

 堆棧可以看作程序的心臟 所有重要的數據都會在這個里面體現(比如運算一道算術題,雖然還沒算出最終答案,但是你在算出最終結果前的一些過程值可以放進堆棧)

堆棧這塊內存比較特殊,他是由大地址往小地址用

 

 1.2棧指針寄存器ESP

假設現在程序的堆棧用到0018FF8C

當我們想使用一個程序停止之后的堆棧空間,

可以使用指令:mov dword ptr ds:[18FF88] ,1

 

         mov dword ptr ds:[18FF84] ,2

但是 因為程序可能接着會執行,所以你得告訴程序,堆棧使用到哪個地方了

所以sub esp,8(棧指針寄存器-8)(相當於完成需要一個mov 一個sub)

如果現在不想用了 ,那么直接add esp,8

之后程序會直接覆蓋

 

2.push指令

這個指令好哇,功能如下

 

 

指令格式:

 

 

 

於是 我們正常使用堆棧的時候要 寫入數據,然后修改ESP(記錄棧頂)

但是現在push一條指令直接搞定 直接push 3 就行 

可以push 立即數 也可以push寄存器比如push EAX(把EAX的值寫到堆棧中並且更新棧頂(ESP))

還可以push內存,把指定內存的值存入堆棧並且更新棧頂(ESP)。

例子:

假如現在ECX的值為

 

 

但是現在 我只想執行十次,那他原來的值,就可以push ECX(這樣就把ECX的值放到了堆棧中)

 

然后再對ECX存入值,mov ecx,10.

 

如果想把存在堆棧中 的00000111再拿回ECX

 

可以mov ECX,dword ptr ds:[堆棧內存編號]

 

  mov ECX,dword ptr ds:[esp]

 

  最后記得給ESP+4,返回之前的堆棧棧頂位置

 

 

 

3.pop指令(把棧頂的值拿出來存到指定的寄存器中)

 

相當於 一個mov 一個add 

 

 

 

 

 

 

總結:堆棧就是一塊特殊的內存 而pop和push 就是釋放和使用這塊內存的指令

學習指令的時候要不要流於形式,要把指令的本質,它做的什么事情搞清楚!


免責聲明!

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



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