返回顶部

堆栈 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 就是释放和使用这块内存的指令

学习指令的时候要不要流于形式,要把指令的本质,它做的什么事情搞清楚!

posted @ 2020-02-03 21:15  cat47  阅读(1251)  评论(0编辑  收藏  举报