总结:常用的通用数据处理指令
作者:bakari 时间:2012.4.21
1、 操作数类型
Imm立即操作数
Reg寄存器操作数
Mem内存操作数
2、 操作数寻址方式
立即数寻址
寄存器数寻址
存储器寻址
3、 数据传送类指令
(重点介绍)mov、xchg、push、pop、lea
(除标志寄存器指令外,其余均不影响标志位)
1.1、 通用数据传送指令
1)、Mov传送指令
两个操作数的尺寸必须是一致的(但movzx和movsx例外)
两个操作数不能同时为内存操作数(内存数据不能直接传送)
指令规则 目的操作数不能为CS、EIP和IP(会覆盖原来其指向的数)
立即数不能直接送段寄存器(不允许:mov DS ,Data)
两个段寄存器之间不能直接传送数据
(其余指令与此类似)
MOVSX:符号扩展
MOVZX:零扩展
8位或16位扩展为32位,两个操作数的尺寸不一致,目的操作数是寄存器
补充:内存内偏移地址的应用 见一段代码:
.data
var1 BYTE 10h
.code
Mov al , var1
方括号:[ ]:可用符号地址代替数值地址(var1是一个符号地址)
.data
Var1 BYTE 10h,20h,30h
.code
Mov al , [var1+2] ;=mov al , var1+2 ;al=30h
2)、交换指令XCHG :
----------------------------见一段指令----------------------
.code
Mov ax,var1
Xchg ax,var2
Mov var2,ax
1.2、 堆栈操作指令(移动地址遵循低对低,高对高的原则)
1)、进栈指令:push指令 ESP指定栈顶的偏移地址
ESP逐渐减少(记忆:把堆栈想象成一个倒扣的桶,栈底是高地址,进栈数据增多ESP下移)
Push指令只表达源操作数,目的操作数在栈顶,由ESP确定。
---------------------见一段代码---------------------
;进栈指令
Push eax ;等同于如下两条指令
Sub esp,4 ;减法指令
Mov [esp],eax ;传送指令
2)出栈指令:pop指令
ESP逐渐增多
源操作数在栈顶由ESP确定,pop指令只表达目的操作数,刚好与push指令相反
----------------------用法见一段指令-----------------
;出栈指令
Pop eax ;等同于如下两条指令
Mov eax , [esp] ;传送指令
Add esp , 4 ;加法指令
-----------------------综合:见一段堆栈操作程序-----------------------
.data
Ten = 10
Dvar DEORD 67762000h , 12345678h
.data
Mov eax , dvar+4 ;eax=12345678h
Push eax ;将eax里的内容压入堆栈
Push DWORD ptr ten ;将立即数以双字量压入堆栈
Push dvar ;将变量的第一个数据压入堆栈
Pop eax ;将栈顶数据弹出到eax
Pop dvar+4 ;栈顶数据弹出到DVAR+4的位置
Mov ebx , dvar+4 ;ebx=0000000AH
Pop ecx ;栈顶数据弹出到ecx
应用堆栈的几点注意以及应用
1、 注意:
-------------由于堆栈的栈顶和内容随着程序的执行不断变化,所以编程时应该注意进栈和出栈的数据要成对,要保持堆栈平衡。
--------------避免16和32为两种传送单位的混用。
2、 应用
-------------堆栈指令、子程序调用指令CALL、子程序反回RET指令、中断调用INT指令、中断返回IRET等指令都会使用堆栈,修改ESP值。
-------------用来存放数据,以便随时恢复它们,使用pop指令时明确栈顶的数据。
-------------可以以随机的方式读取其中的数据,EBP就是以这个目的而设计(见一段代码)
Mov ebp , esp
Mov eax , [ebp+8]
Mov [ebp] , eax
------------利用堆栈实现主程序与子程序间的传递参数
------------还常用于子程序的寄存器保护和恢复,进行快速的现场保护和恢复。
1.3、 其他传送指令
1)、地址传送指令:lEA
-----------------------LEA 的一点重点-----------------------------
-LEA与offset的区别
LEA:CPU的指令,后面课跟标号、常量和表达式
Offset:伪指令,后面只能跟标号和常量
------------见一段代码
Buffer dp 100 dup ( 0 ) ;开辟100个连续字节的的初始化为零的空间
;dp 与WORD,BYTE形式类似
;buffer 类似数组名,指向的是数组的首地址
.code
Lea ebx , buffer ;(送首地址)
Mov ebx , offset buffer ;(送地址)
Mov ebx , buffer ;(送第一个数 零)
Lea ebx , [buffer+50] ;(送地51个地址)
Mov enx ,offset [buffer+50] ;ERROR!(buffer+50已经是地址,offset有送地址,乱套了!)
一般来说:注意:
mov reg , offset XXX 比 Lea reg , XX 的指令长度少一个字节,快一个时钟,但lea更灵活
总结:常用的通用数据处理指令相关推荐
- 【汇编语言】通用数据处理指令——位操作类指令
通用数据处理指令--位操作类指令 文章目录 通用数据处理指令--位操作类指令 一.逻辑运算指令 1.逻辑与指令AND 2.逻辑或指令OR 3.逻辑非指令NOT 4.逻辑异或指令XOR 5.逻辑运算的应 ...
- 【汇编语言】通用数据处理指令——算术运算类指令
通用数据处理指令--算术运算类指令 文章目录 通用数据处理指令--算术运算类指令 一.状态标志 1.进位标志CF(Carry Flag) 2.溢出标志OF(Overflow Flag) 3.零标志ZF ...
- 【汇编语言】通用数据处理指令——数据传送类指令
通用数据处理指令--数据传送类指令 文章目录 通用数据处理指令--数据传送类指令 一.MOV指令 1.数据长度 2.传送方式 3.常见错误 二.XCHG指令 1.数据长度 2.空操作指令NOP(no- ...
- 【ARMv8 编程】A64 数据处理指令——算术指令
许多在应用程序级别编写代码的程序员不需要用汇编语言编写代码.然而,汇编代码在需要高度优化的代码的情况下很有用.在编写编译器时,或者需要使用 C 语言中无法直接提供的底层特性时,都会出现这种情况.部分引 ...
- ARM指令寻址方式之: 数据处理指令的寻址方式
4.1 数据处理指令的寻址方式 4.1.1 数据处理指令的寻址方式概要 数据处理指令的基本语法格式如下. <opcode> {<cond>} {S} <Rd>, ...
- VB的一些项目中常用的通用方法-一般用于验证类
1.VB的一些项目中常用的通用方法: ' 设置校验键盘输入值,数字 Public Function kyd(key As Integer) As Integer '20060728 Dim mycha ...
- 通用apdu指令_8086微处理器中的通用指令格式
通用apdu指令 Introduction: 介绍: In this article, we are going to discuss about the 6 general formats of i ...
- 【Vue2.0】—常用的内置指令(九)
[Vue2.0]-常用的内置指令(九) <body><div id="root"><h1 v-pre>好好学习</h1><h1 ...
- 汇编(二)——ARM数据处理指令——算术运算、数据传送
ARM指令集 数据操作 ARM指令的种类 数据处理指令 程序状态寄存器与通用寄存器之间的传送指令 Load/Store指令 转移指令 异常中断指令 协处理器指令 数据处理指令分为6类 数据传送指令 算 ...
最新文章
- poj2305-Basic remains(进制转换 + 大整数取模)
- 理解C++中拷贝构造函数
- 华为5G英国首秀,BBC主持人震惊了!到底网速有多快?
- 见贤思齐焉,送3本新书
- 卫星通信 | 使用虹科SAF手持式频谱分析仪进行TDD信号分析
- 怎么查看台式计算机网络密码,台式电脑怎么查看wifi密码_台式机如何看wifi密码?-192路由网...
- 特征图注意力_【抠图中的注意力机制】HAttMatting---让抠图变得如此简单!
- 如何关闭流氓软件弹窗广告
- Oracle官网下载各版本JDK+查看各版本的API文档
- EBS R12: 通过FND_PRODUCT_INSTALLATIONS中字段STATUS确认安装使用了哪些产品(或模块)
- ROS单线程与多线程处理
- U盘产生快捷方式病毒
- Seq2Seq模型中的序列解码策略
- python使用QDA进行二次判别分析
- 关于成功人士成功秘诀的乱弹琴
- 探讨Vue 数据监测原理-第五节-展开介绍 Vue中监测-【数组】数据的原理
- BZOJ3141:[HNOI2013]旅行
- 没学过量子力学,物理学也是一团糟,不过我觉得这个故事很有意思
- W: 由于文件‘git_2.17.1-1ubuntu0.8.dsc‘无法被用户‘_apt‘访问,已脱离沙盒并提权为根用户来进行下载。 - pkgAcquire::Run (13: 权限不够)
- CPU分析系列--sysstat(mpstat+pidstat)分析系统CPU和I/O负载
热门文章
- linux系统ftp优化,Linux vsftp 部署优化
- 使用左 右 全 内连接及使用where条件语句的区别
- 报错,java.lang.NoSuchMethodException: java.awt.print.Pageable
- Top 10 Digital Transformation Trends For 2020
- 安卓案例:利用内容提供者显示和添加联系人
- Java案例:汉诺塔问题
- QT案例:登录对话框——主窗口
- 【HDU5091】Beam Cannon,扫描线+线段树
- 【BZOJ4517】排列计数,组合数+错排
- nuttx linux 编译,linux下建立nuttx开发环境