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 就是釋放和使用這塊內存的指令
學習指令的時候要不要流於形式,要把指令的本質,它做的什么事情搞清楚!