zoukankan      html  css  js  c++  java
  • 堆栈 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 就是释放和使用这块内存的指令

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

  • 相关阅读:
    多个数字和数字字符串混合运算规则
    关于js对象引用的小例子
    实现函数 isInteger(x) 来判断 x 是否是整数
    写一个少于 80 字符的函数,判断一个字符串是不是回文字符串
    关于数组排序
    事件委托(事件代理)的原理以及优缺点是什么?
    将url的查询参数解析成字典对象
    js dom操作获取节点的一些方法
    js中arguments的应用
    深度克隆---js对象引用
  • 原文地址:https://www.cnblogs.com/cat47/p/12257394.html
Copyright © 2011-2022 走看看