汇编push,pop
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。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的更多相关文章
- 汇编 push ,pop指令
知识点: PUSH POP CALL堆栈平衡 RETN指令 一.PUSH入栈指令 (压栈指令): 格式: PUSH 操作数 //sub esp,4 ;mov [esp],EBP 操作数 ...
- 数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)
普通的栈,push, pop 操作的复杂度是 O(1), 但是如果要找出其中的最小值,则需要 O(N)的时间. 题目要求 min 复杂度也是 O(1), 做法便是 空间换时间,每一步栈的最小值都用一个 ...
- js中常用数组方法concat join push pop slice splice shift
javascript给我们很多常用的 数组方法,极大方便了我们做程序.下面我们来介绍下常用的集中数组方法. 比如 concat() join() push() pop() unshift() shif ...
- 解决 iOS View Controller Push/Pop 时的黑影
那么如何解决这个问题呢? 实际上很简单,如果这个 ViewController 是在 TabBarViewController 的 NavigationController 上 Push/Pop 的, ...
- js中push(),pop(),unshift(),shift()的用法
js中push(),pop(),unshift(),shift()的用法小结 1.push().pop()和unshift().shift() 这两组同为对数组的操作,并且会改变数组的本身的长度及 ...
- js push(),pop(),shift(),unshift()
以前没有太在意这些,这几天看<Javascript 设计模式与开发实践>(不得不说这是一本好书) 发现总是会用到这几个函数,可是有什么区别呢?? 简单来说是两套东西(数据结构时老师详细的讲 ...
- js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip
push()函数用于向当前数组的添加一个或多个元素,并返回新的数组长度.新的元素将会依次添加到数组的末尾. 该函数属于Array对象,所有主流浏览器均支持该函数. 语法 array.push( ite ...
- 数组方法push() pop() shift() unshift() splice() sort() reverse() contact()浅拷贝 slice()原数组拷贝
push() pop() shift() unshift() splice() sort() reverse() 参考资料:https://wangdoc.com/javascript/stdlib/ ...
- 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 ...
- 自定义Push/Pop和Present/Dismiss转场
项目概述 iOS中最常见的动画无疑是Push和Pop的转场动画了,其次是Present和Dismiss的转场动画. 如果我们想自定义这些转场动画,苹果其实提供了相关的API,在自定义转场之前,我们需要 ...
随机推荐
- sqlserver2008R2 本地不能用localhost连接
问题 在重新安装sql Server2008R2的时候,本地安装完成之后,想用localhost或者127.0.0.1登录的时候发现一直报错,无法连接,以下是解决方案. 打开Sql Server配置管 ...
- PHP代码篇(二)-- array_column函数将二维数组格式化成固定格式的一维数组,及优化查询方法
小白因为经常用到多表查询,比如获取一个会员领取的卡卷list,里面当然包含了1“会员优惠券记录表t_coupon_members”主表,然后2“门店优惠券表t_coupon”,和3“门店信息表t_sh ...
- 将select 转为json
CREATE PROCEDURE[dbo].[WXSP_SerializeJSON](@ParameterSQL AS VARCHAR(MAX))ASBEGIN DECLARE @SQL NVARCH ...
- [日常] lscpu查看cpu的详细信息
查看自己电脑的cpu的详细信息 root@tao-PC:/home/tao# lscpu Architecture: x86_64 CPU op-mode(s): -bit, -bit Byte Or ...
- awk常用命令
1.统计TCP的连接数量,其中LISTEN多少个,ESTABLISHED多少个. [root@heiniao ~]# netstat -ant Active Internet connections ...
- windows server2008 R2下mysql 5.7版本中修改编码为utf-8的方法步骤
首先通过 show variables like 'character_set_%'; 查看mysql字符集情 默认编码为 latin1 然后关闭数据库 在mysql安装目录下找到my.ini文件 在 ...
- C++ 标准库 std::remove
参见:https://zh.cppreference.com/w/cpp/algorithm/remove std::remove 不会改变输入vector / string 的长度.其过程,相当于去 ...
- KPConv针对Modelnet40的分类
1. 训练样本airplane_0001.txt的可视化: 飞机尺度: 物体类别与对应标签: 2. 对训练样本进行降采样: 体素法降采样,降采样的网络大小设置为0.02m.在pycharm下面的Con ...
- Python thread (线程)
线程 (thread) 操作系统最小的调度单位,是一串指令的集合 程序一开始就有一个主线程,新启动的线程和主线程之间互不影响,主线程启动子线程之后就相互独立(子线程也可以启动线程),无论子线程是否执行 ...
- Python进阶-XV 类和对象的命名空间 组合
一.类和对象命名空间 1.类中可以定义两种属性 静态属性和动态属性 class Course: language = 'Chinese' # 静态属性 def __init__(self, name, ...