汇编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,在自定义转场之前,我们需要 ...
随机推荐
- [Go] golang实现mysql连接池
golang中连接mysql数据库,需要使用一个第三方类库github.com/go-sql-driver/mysql,在这个类库中就实现了mysql的连接池,并且只需要设置两个参数就可以实现 一般连 ...
- SpringCloud学习笔记(七、SpringCloud Netflix Zuul)
目录: springcloud整合eureka.config.zuul zuul源码分析 springcloud整合eureka.config.zuul: 1.架构图 2.GitHub:https:/ ...
- 【Eureka篇三】Eureka集群配置(5)
1. 新建子模块microservicecloud-eureka-7002(后面简称7002) 和 microservicecloud-eureka-7003(后面简称为7003),packaging ...
- LeetCode 62. Unique Paths不同路径 (C++/Java)
题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...
- luoguP4774 [NOI2018]屠龙勇士
题意 考虑杀每只龙\(i\)时候用的剑是一定的,我们可以用multiset模拟一遍得到,设为\(b_i\). 发现我们要求一个\(x\)满足对每个\(i\)有:\(b_i*x\equiv a_i\pm ...
- nodejs 连接MySQL后,输出数据带有RowDataPacket、中括号大括号怎么去掉?
var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : ' ...
- hdu6514 一维化 + 二维前缀和
http://acm.hdu.edu.cn/showproblem.php?pid=6514 题意 给出一个大矩形(\(nm\leq10^7\)),有p个矩形覆盖,然后有q次询问,询问指定矩形内是否覆 ...
- CF1178 F1 Short Colorful Strip
题目链接 题意 有个长度为\(m\)公分的布,要在上面每公分都染上颜色,整块布染恰好\(n(n=m)\)种颜色.颜色标号从\(1\)到\(n\).染色需遵循: 1.从颜色\(1\)到颜色\(n\)依次 ...
- maven pom项目的dependencies转gradle格式
1.新建一个文件件 2.创建pom.xm,放到新建的文件夹中 3.在命令行切换到新建文件夹中,执行: gradle init --type pom
- torch_13_自定义数据集实战
1.将图片的路径和标签写入csv文件并实现读取 # 创建一个文件,包含image,存放方式:label pokemeon\\mew\\0001.jpg,0 def load_csv(self,file ...