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

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

  • 相关阅读:
    896. Monotonic Array单调数组
    865. Smallest Subtree with all the Deepest Nodes 有最深节点的最小子树
    489. Robot Room Cleaner扫地机器人
    JavaFX
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
  • 原文地址:https://www.cnblogs.com/cat47/p/12257394.html
Copyright © 2011-2022 走看看