汇编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,在自定义转场之前,我们需要 ...
随机推荐
- 7.python3实用编程技巧进阶(二)
2.1.如何拆分含有多种分隔符的字符串 #2.1.如何拆分含有多种分隔符的字符串 s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz' #第一种方法 def my__ ...
- CSS 轻松搞定标签(元素)居中问题
在CSS里,标签位置居中一直是困扰Web前端的难题.在本文中,我对这类问题进行了探究和给出了几点建议,供读者参考. 1 行内标签 1.1 水平居中 在父级标签中使用 text-align: cente ...
- 无法打开“Visual Studio Code”,因为Apple无法检查其是否包含恶意软件。”的问题解决
解决方法: 1.系统偏好设置==> 安全性与隐私 ===> 在下方允许就可以了. 2.一劳永逸 但是注意安全性 打开terminal 命令行工具输入命令:sudo spctl --mast ...
- Linux:别名的设置
作用 别名的作用是将较长的命令做简化 定义别名 alias [别名[=原命令]] 删除别名 unalias 查看系统可用别名 alias
- C学习笔记(10)--- 强制类型转换,错误处理,递归
1.强制类型转换: 强制类型转换是把变量从一种类型转换为另一种数据类型.例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型. 您可以使用强制 ...
- Ubuntu 18.04安装 pyenv、pyenv-virtualenv、virtualenv、Numpy、SciPy、Pillow、Matplotlib
1.目前Python版本管理工具有很多,pyenv是比较好用的一款,安装如下: 输入: git clone https://github.com/pyenv/pyenv.git ~/.pyenv ec ...
- 遗传算法求解旅行商(TSP)问题 -- python
参考资料: 遗传算法解决TSP旅行商问题(附:Python实现) 遗传算法详解(GA)(个人觉得很形象,很适合初学者) from itertools import permutations impor ...
- day74_10_21 三大认证
一.权限六表. 一般在django中,基于用户权限访问控制的认证是RBAC(Role-Based Access Control) 还有一些基于auth的认证规则. Django框架采用的是RBAC认证 ...
- js 三种存储方式的区别
javaScript有三种数据存储方式,分别是: sessionStorage localStorage cookie 相同点:都保存在浏览器端,同源的 不同点: ①传递方式不同 cookie数据始终 ...
- zz自动驾驶复杂环境下高精度定位技术
今天为大家分享下,自动驾驶在复杂环境下的高精度定位技术. 定位/导航负责实时提供载体的运动信息,包括载体的:位置.速度.姿态.加速度.角速度等信息. 自动驾驶对定位系统的基本要求: 1. 高精度:达到 ...