作者: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 axvar1

Xchg axvar2

Mov var2ax

 

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. 【汇编语言】通用数据处理指令——位操作类指令

    通用数据处理指令--位操作类指令 文章目录 通用数据处理指令--位操作类指令 一.逻辑运算指令 1.逻辑与指令AND 2.逻辑或指令OR 3.逻辑非指令NOT 4.逻辑异或指令XOR 5.逻辑运算的应 ...

  2. 【汇编语言】通用数据处理指令——算术运算类指令

    通用数据处理指令--算术运算类指令 文章目录 通用数据处理指令--算术运算类指令 一.状态标志 1.进位标志CF(Carry Flag) 2.溢出标志OF(Overflow Flag) 3.零标志ZF ...

  3. 【汇编语言】通用数据处理指令——数据传送类指令

    通用数据处理指令--数据传送类指令 文章目录 通用数据处理指令--数据传送类指令 一.MOV指令 1.数据长度 2.传送方式 3.常见错误 二.XCHG指令 1.数据长度 2.空操作指令NOP(no- ...

  4. 【ARMv8 编程】A64 数据处理指令——算术指令

    许多在应用程序级别编写代码的程序员不需要用汇编语言编写代码.然而,汇编代码在需要高度优化的代码的情况下很有用.在编写编译器时,或者需要使用 C 语言中无法直接提供的底层特性时,都会出现这种情况.部分引 ...

  5. ARM指令寻址方式之: 数据处理指令的寻址方式

    4.1  数据处理指令的寻址方式 4.1.1  数据处理指令的寻址方式概要 数据处理指令的基本语法格式如下. <opcode> {<cond>} {S} <Rd>, ...

  6. VB的一些项目中常用的通用方法-一般用于验证类

    1.VB的一些项目中常用的通用方法: ' 设置校验键盘输入值,数字 Public Function kyd(key As Integer) As Integer '20060728 Dim mycha ...

  7. 通用apdu指令_8086微处理器中的通用指令格式

    通用apdu指令 Introduction: 介绍: In this article, we are going to discuss about the 6 general formats of i ...

  8. 【Vue2.0】—常用的内置指令(九)

    [Vue2.0]-常用的内置指令(九) <body><div id="root"><h1 v-pre>好好学习</h1><h1 ...

  9. 汇编(二)——ARM数据处理指令——算术运算、数据传送

    ARM指令集 数据操作 ARM指令的种类 数据处理指令 程序状态寄存器与通用寄存器之间的传送指令 Load/Store指令 转移指令 异常中断指令 协处理器指令 数据处理指令分为6类 数据传送指令 算 ...

最新文章

  1. poj2305-Basic remains(进制转换 + 大整数取模)
  2. 理解C++中拷贝构造函数
  3. 华为5G英国首秀,BBC主持人震惊了!到底网速有多快?
  4. 见贤思齐焉,送3本新书
  5. 卫星通信 | 使用虹科SAF手持式频谱分析仪进行TDD信号分析
  6. 怎么查看台式计算机网络密码,台式电脑怎么查看wifi密码_台式机如何看wifi密码?-192路由网...
  7. 特征图注意力_【抠图中的注意力机制】HAttMatting---让抠图变得如此简单!
  8. 如何关闭流氓软件弹窗广告
  9. Oracle官网下载各版本JDK+查看各版本的API文档
  10. EBS R12: 通过FND_PRODUCT_INSTALLATIONS中字段STATUS确认安装使用了哪些产品(或模块)
  11. ROS单线程与多线程处理
  12. U盘产生快捷方式病毒
  13. Seq2Seq模型中的序列解码策略
  14. python使用QDA进行二次判别分析
  15. 关于成功人士成功秘诀的乱弹琴
  16. 探讨Vue 数据监测原理-第五节-展开介绍 Vue中监测-【数组】数据的原理
  17. BZOJ3141:[HNOI2013]旅行
  18. 没学过量子力学,物理学也是一团糟,不过我觉得这个故事很有意思
  19. W: 由于文件‘git_2.17.1-1ubuntu0.8.dsc‘无法被用户‘_apt‘访问,已脱离沙盒并提权为根用户来进行下载。 - pkgAcquire::Run (13: 权限不够)
  20. CPU分析系列--sysstat(mpstat+pidstat)分析系统CPU和I/O负载

热门文章

  1. linux系统ftp优化,Linux vsftp 部署优化
  2. 使用左 右 全 内连接及使用where条件语句的区别
  3. 报错,java.lang.NoSuchMethodException: java.awt.print.Pageable
  4. Top 10 Digital Transformation Trends For 2020
  5. 安卓案例:利用内容提供者显示和添加联系人
  6. Java案例:汉诺塔问题
  7. QT案例:登录对话框——主窗口
  8. 【HDU5091】Beam Cannon,扫描线+线段树
  9. 【BZOJ4517】排列计数,组合数+错排
  10. nuttx linux 编译,linux下建立nuttx开发环境