堆栈 pop push

Posted cat47

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆栈 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 就是释放和使用这块内存的指令

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

以上是关于堆栈 pop push的主要内容,如果未能解决你的问题,请参考以下文章

堆栈 pop push

堆栈中PUSH与POP

在堆栈中,push为入栈操作,pop为出栈操作

堆栈的三种实现方式

PUSH指令 POP指令

基于C语言堆栈push,pop,destroystack,isEmpty,isFull实现