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的更多相关文章

  1. 小tip:关于typeof,instanceof,toString(),valueOf(),toLocaleString(),join(),reverse(),sort(),pop(),push(),shift(),unshift()

    typeof:用于检测一个变量是否是基本数据类型.instanceof用于检测某引用对象是什么类型的对象. var s = "Nicho"; var b = true; var n ...

  2. js 数组的pop(),push(),shift(),unshift()方法小结

    关于数组的一些操作方法小结: pop(),push(),shift(),unshift()四个方法都可改变数组的内容以及长度: 1.pop() :删除数组的最后一个元素,并返回被删除的这个元素的值: ...

  3. JS pop push unshift shift的作用与区别

    白话JS中数组方法pop push unshift shift的作用与区别,通过本文,你大概能知道这四种数组方法的基本使用与大致区别. 首先,这四种方法会直接修改数组,请先记住这一点. 我们先把pop ...

  4. queue for max elem, pop, push

    queue for max elem, pop, push 个人信息:就读于燕大本科软件project专业 眼下大三; 本人博客:google搜索"cqs_2012"就可以; 个人 ...

  5. 自定义栈类型,具有找到站内最小元素的min函数 ,且min(),pop(),push()函数的时间复杂度为O(1)

    基本思想: // 借助一个辅助栈,入栈时,若新元素比辅助栈栈顶元素小,则直接放入辅助站 // 反之,辅助站中放入次小元素(即辅助栈栈顶元素)====保证最小元素出栈时,次小元素被保存 static c ...

  6. JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()

    一.Array 1.some()和every() some()是对数组中每一项运行指定函数,如果该函数对任一项返回true,则返回true. every()是对数组中的每一项运行给定函数,如果该函数对 ...

  7. mongo 修改器 $inc/$set/$unset/$pop/$push/$pull/$addToSet

    mongo $inc 可以对集合里面的某些值是数字的增减.看代码 $set  可以进行修改,并且不存在的时候默认添加. 同时还能该变数据的类型. 还可以该变内嵌元素的值 用.调用 $unset  删除 ...

  8. js array filter pop push shift unshift方法

    JavaScript Array filter() 方法  JavaScript Array 对象 实例 返回数组 ages 中所有元素都大于 18 的元素: var ages = [32, 33,  ...

  9. <h2>js数组操作大全(pop,push,unshift,splice,shift方法)</h2>

    ---恢复内容开始--- shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a ...

随机推荐

  1. java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  2. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:包装类

    public class WrapperDemo01{ public static void main(String args[]){ int x = 30 ; // 基本数据类型 Integer i ...

  3. (十)微信小程序---上传图片chooseImage

    官方文档 示例一 wxml <view bindtap="uploadImage">请上传图片</view> <image wx:for=" ...

  4. 最新获取 QQ头像 和 昵称接口

    网上找来的测试可用... 获取QQ头像 http://q2.qlogo.cn/headimg_dl?bs=QQ号&dst_uin=QQ号&dst_uin=QQ号&;dst_ui ...

  5. JMeter学习-图形化 HTML 报表概要说明

    JMeter 3.0开始支持动态生成图形化 HTML dashboard报告,当前生成报告有一下两种方式: 1.脚本测试执行结束后,即生成HTML测试报告 2.通过之前生成的测试结果,生成HTML测试 ...

  6. 浅析 URL

    浅析 URL 参考于维基百科 URL => Uniform Resource Locator : 统一资源定位符 统一资源定位符的标准格式如下: [协议类型]://[服务器地址]:[端口号]/[ ...

  7. PHP开发环境(Apache+mysql+PHPstorm+php)的搭建

    一.搭建思路 从浏览器到web服务器(Apache)到PHP环境到mysql数据库 二.环境搭建 1.浏览器(略) 2.Apache的安装与配置 1)官方下载地址:https://httpd.apac ...

  8. python isdigit()函数

    isdigit() 函数是作用于字符串的,用来判断字符串是否全部由数字组成. x = '123456' y = 'iloveyou123' print(x.isdigit(),y.isdigit()) ...

  9. 计算机是如何计算的、运行时栈帧分析(神奇i++续)

    关于i++的疑问 通过JVM javap -c 查看字节码执行步骤了解了i++之后,衍生了一个问题: int num1=50; num1++*2执行的是imul(将栈顶两int类型数相乘,结果入栈), ...

  10. UVA 12511/CSU 1120 virus 最长公共上升子序列

    第一次接触一个这最长公共上升子序列 不过其实搞清楚了跟最长公共子序列和 最长上升子序列如出一辙 两重循环,对于当前不相等的,等于前一个的值,相等的,等于比当前A[i]小的最大值+1.弄个临时变量记录最 ...