版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-24,00:40:12
作者By-----溺心与沉浮----博客园

1、BASE,TOP是2个32位的通用寄存器,里面存储的是内存单元编号(内存地址).

2、BASE里面存储了一个地址,记录的起始地址.

3、TOP里面也存储了一个地址,记录的是结束的地址.

4、存入数据的时候,TOP的值减4(为方便演示,每次存取都是4个字节)

5、释放数据的时候,TOP的值加4(为方便演示,每次存取都是4个字节)

6、如果要读取中间的某个数据的时候可以通过TOP 或者 BASE 加上偏移的方式去读取

7、这种内存的读写方式有个学名:堆栈

堆栈的优点:临时存储大量的数据,便于查找.

在OD中红框位置,随机选取一个内存地址作为我们的栈底与栈顶,我已0x18FFD0为例,用EDX,EBX仿ESP,EBP

  MOV EDX,0x18FFD0  TOP

  MOV EBX,0x18FFD0  BASE

1、压入数据

  压入数据的方法很多

方式一、

  MOV DWORD PTR DS:[EDX-4],0xAAAAAAAA

    SUB EDX,4

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-24,00:40:12
作者By-----溺心与沉浮----博客园

代码执行后:

后面的就不上图了

方式2、

  SUB EDX,4

    MOV DWORD PTR DS:[EDX],0xBBBBBBBB

方式3、

  LEA EDX,DWORD PTR DS:[EDX-4]

  MOV DWORD PTR DS:[EDX],0xCCCCCCCC

方式4、

  MOV DWORD PTR DS:[EDX-4],0xDDDDDDDD

  LEA EDX,DWORD PTR DS:[EDX-4]

步骤2、读取第N个数

方式1、通过BASE加偏移的形式来读取,读出来的值放到ESI中

读第一个压入的数据

  MOV ESI,DWORD PTR DS:[EBX-4]

读第四个压入的数据

  MOV ESI,DWORD PTR DS:[EBX-10]  

方式2、通过TOP加偏移的形式来读取,读出来的值放到ESI中

读第一个压入的数据

  MOV ESI,DWORD PTR DS:[EDX+10]

读第四个压入的数据

  MOV ESI,DWORD PTR DS:[EDX+4]

步骤3、弹出数据

方法1、

  MOV ECX,DWORD PTR DS:[EDX]

  ADD EDX,0x4

方法2、

  LED EDX,DWORD PTR DS:[EDX+0x4]

  MOV ECX,DWORD PTR DS:[EDX-0x4]

方法3、

  MOV ECX,DWORD PTR DS:[EDX]

  LEA EDX,DWORD PTR DS:[EDX+0x4]

push指令:

    1、PUSH r32

  2、PUSH r16

  3、PUSH m16

  4、PUSH m32

  5、PUSH imm8/imm16/imm32

pop指令:

  1、POP r32

  2、POP r16

  3、POP m16

  4、POP m32

1、使用2种方式实现:push ecx

一、

  MOV DWORD PTR DS:[ESP-0x4],0x1

  LEA ESP,DWORD PTR DS:[ESP-0x4]

二、

  LEA ESP,DWORD PTR DS:[ESP-0x4]

  MOV DWORD PTR DS:[ESP],0x1

三、

  MOV DWORD PTR DS:[ESP-0x4],0x1

  SUB ESP,0x4

四、

  SUB ESP,0x4

  MOV DWORD PTR DS:[ESP],0x1

2、使用2种方式实现:pop ecx

一、

  ADD ESP,0x4

  MOV EAX,DWORD PTR DS:[ESP-0x4]

二、

  MOV EAX,DWORD PTR DS:[ESP]

  ADD ESP,0x4

三、

  MOV EAX,DWORD PTR DS:[ESP]

  LEA ESP,DWORD PTR DS:[ESP+0x4]

四、

  LEA ESP,DWORD PTR DS:[ESP+0x4]

  MOV EAX,DWORD PTR DS:[ESP-0x4]

3、使用2种方式实现:push esp

一、

  MOV EAX,ESP

  MOV DWORD PTR DS:[ESP-4],EAX

  SUB ESP,4

二、

  MOV DWORD PTR DS:[ESP-4],ESP

  SUB ESP,4

4、使用2种方式实现:pop esp

一、

  MOV EAX,DWORD PTR DS:[ESP]

  MOV ESP,EAX

二、

  MOV ESP,DWORD PTR DS:[ESP]

三、

  ADD ESP,4

  MOV ESP,DWORD PTR DS:[ESP-4]

push一定是减去4个字节吗?

答:不是,push可以对一个字的寄存器或者内存进行push,此时是2字节,对双字的寄存器或者内存进行push的时候,是4字节,

注意:push不能push一个字节的寄存器或者内存,pop同push

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-24,00:40:12
作者By-----溺心与沉浮----博客园

汇编push,pop的更多相关文章

  1. 汇编 push ,pop指令

    知识点:  PUSH  POP  CALL堆栈平衡  RETN指令 一.PUSH入栈指令 (压栈指令): 格式: PUSH 操作数 //sub esp,4 ;mov [esp],EBP 操作数 ...

  2. 数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)

    普通的栈,push, pop 操作的复杂度是 O(1), 但是如果要找出其中的最小值,则需要 O(N)的时间. 题目要求 min 复杂度也是 O(1), 做法便是 空间换时间,每一步栈的最小值都用一个 ...

  3. js中常用数组方法concat join push pop slice splice shift

    javascript给我们很多常用的 数组方法,极大方便了我们做程序.下面我们来介绍下常用的集中数组方法. 比如 concat() join() push() pop() unshift() shif ...

  4. 解决 iOS View Controller Push/Pop 时的黑影

    那么如何解决这个问题呢? 实际上很简单,如果这个 ViewController 是在 TabBarViewController 的 NavigationController 上 Push/Pop 的, ...

  5. js中push(),pop(),unshift(),shift()的用法

    js中push(),pop(),unshift(),shift()的用法小结   1.push().pop()和unshift().shift() 这两组同为对数组的操作,并且会改变数组的本身的长度及 ...

  6. js push(),pop(),shift(),unshift()

    以前没有太在意这些,这几天看<Javascript 设计模式与开发实践>(不得不说这是一本好书) 发现总是会用到这几个函数,可是有什么区别呢?? 简单来说是两套东西(数据结构时老师详细的讲 ...

  7. js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip

    push()函数用于向当前数组的添加一个或多个元素,并返回新的数组长度.新的元素将会依次添加到数组的末尾. 该函数属于Array对象,所有主流浏览器均支持该函数. 语法 array.push( ite ...

  8. 数组方法push() pop() shift() unshift() splice() sort() reverse() contact()浅拷贝 slice()原数组拷贝

    push() pop() shift() unshift() splice() sort() reverse() 参考资料:https://wangdoc.com/javascript/stdlib/ ...

  9. Mongodb更新数组$pull修饰符 (mongodb 修改器($inc/$set/$unset/$push/$pop/upsert))

    mongodb 修改器($inc/$set/$unset/$push/$pop/upsert))   https://www.jb51.net/article/112588.htm http://bl ...

  10. 自定义Push/Pop和Present/Dismiss转场

    项目概述 iOS中最常见的动画无疑是Push和Pop的转场动画了,其次是Present和Dismiss的转场动画. 如果我们想自定义这些转场动画,苹果其实提供了相关的API,在自定义转场之前,我们需要 ...

随机推荐

  1. 7.python3实用编程技巧进阶(二)

    2.1.如何拆分含有多种分隔符的字符串 #2.1.如何拆分含有多种分隔符的字符串 s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz' #第一种方法 def my__ ...

  2. CSS 轻松搞定标签(元素)居中问题

    在CSS里,标签位置居中一直是困扰Web前端的难题.在本文中,我对这类问题进行了探究和给出了几点建议,供读者参考. 1 行内标签 1.1 水平居中 在父级标签中使用 text-align: cente ...

  3. 无法打开“Visual Studio Code”,因为Apple无法检查其是否包含恶意软件。”的问题解决

    解决方法: 1.系统偏好设置==> 安全性与隐私 ===> 在下方允许就可以了. 2.一劳永逸 但是注意安全性 打开terminal 命令行工具输入命令:sudo spctl --mast ...

  4. Linux:别名的设置

    作用 别名的作用是将较长的命令做简化 定义别名 alias [别名[=原命令]] 删除别名 unalias 查看系统可用别名 alias

  5. C学习笔记(10)--- 强制类型转换,错误处理,递归

    1.强制类型转换: 强制类型转换是把变量从一种类型转换为另一种数据类型.例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型. 您可以使用强制 ...

  6. Ubuntu 18.04安装 pyenv、pyenv-virtualenv、virtualenv、Numpy、SciPy、Pillow、Matplotlib

    1.目前Python版本管理工具有很多,pyenv是比较好用的一款,安装如下: 输入: git clone https://github.com/pyenv/pyenv.git ~/.pyenv ec ...

  7. 遗传算法求解旅行商(TSP)问题 -- python

    参考资料: 遗传算法解决TSP旅行商问题(附:Python实现) 遗传算法详解(GA)(个人觉得很形象,很适合初学者) from itertools import permutations impor ...

  8. day74_10_21 三大认证

    一.权限六表. 一般在django中,基于用户权限访问控制的认证是RBAC(Role-Based Access Control) 还有一些基于auth的认证规则. Django框架采用的是RBAC认证 ...

  9. js 三种存储方式的区别

    javaScript有三种数据存储方式,分别是: sessionStorage localStorage cookie 相同点:都保存在浏览器端,同源的 不同点: ①传递方式不同 cookie数据始终 ...

  10. zz自动驾驶复杂环境下高精度定位技术

    今天为大家分享下,自动驾驶在复杂环境下的高精度定位技术. 定位/导航负责实时提供载体的运动信息,包括载体的:位置.速度.姿态.加速度.角速度等信息. 自动驾驶对定位系统的基本要求: 1. 高精度:达到 ...