指令格式
操作码 操作数 ;注释
操作码:不可少,说明要执行的操作,用助记符表示,有明确的机器码
操作数:单/双/无;可以为立即数,寄存器,存储单元,I/O 接口
双操作数式:操作码 目的操作数 源操作数
操作数类型
1、立即数(常数)
可以是一个字节或字
取值范围:
注:立即数只能作源操作数。
2、寄存器操作数
通用寄存器reg
段寄存器 seg
-
通用寄存器:
AX,BX,CX,DX 称作为数据寄存器:AX (Accumulator):累加寄存器,也称之为累加器; BX (Base):基地址寄存器; CX (Count):计数器寄存器; DX (Data):数据寄存器;
SP 和 BP 又称作为指针寄存器:
SP (Stack Pointer):堆栈指针寄存器; BP (Base Pointer):基指针寄存器;
SI 和 DI 又称作为变址寄存器:
SI (Source Index):源变址寄存器; DI (Destination Index):目的变址寄存器;
-
控制寄存器:
IP (Instruction Pointer):指令指针寄存器;
FLAG:标志寄存器; -
段寄存器:
CS (Code Segment):代码段寄存器;
DS (Data Segment):数据段寄存器;
SS (Stack Segment):堆栈段寄存器;
ES (Extra Segment):附加段寄存器;
以上是常见的寄存器分类;其中值得注意的每个寄存器的都是16位的(即dword双字节的),而除了4个数据寄存器之外的寄存器均不可分为两个8位的寄存器使用(需要重点注意)我们就这几个寄存器简单的总结一下各自的作用:(注意在debug模式下数字默认是16进制的,而在记事本中编辑汇编代码是10进制的,需要在其后加上h表示16进制)
-
控制寄存器:
IP (Instruction Pointer):指令指针寄存器;
FLAG:标志寄存器
3、存储器操作数
存放在存储单元的操作数
类型可以是字节或者字
注:不允许两个操作数的类型均为存储器操作数
寻址方式
指令中指定操作数所在位置的方法,一般指源操作数
寻址方式分类
1、立即数寻址方式
2、寄存器寻址方式
3、存储器寻址方式
细分: 直接寻址
寄存器间接寻址
寄存器相对寻址
基址变址寻址
基址变址相对寻址
立即寻址
- 操作数作为指令的一部分而直接写在指令中。
- 立即数可以是8位也可以是16位。(16位高字节放在高地址)
- 操作数可以是计算机有效数制下的数值,也可以是字符(ASCII码)
- 立即数只能是源操作数
具体例子:
MOV AL,05H ;AL←05H
MOV AX,0102H ;AX←0102H
寄存器寻址
操作数放在某个寄存器中,不需要访问存储器来取得操作数
- 操作数可以是8位也可以是16位
- 寄存器寻址方式可以是源操作数也可以是目的操作数
- 注意:源操作数与目的操作数字长要匹配
寄存器寻址方式是执行速度最快的寻址方式
原因:数据就寄存器里,寄存器在cpu内部,
例子
MOV BX,AX ;BX←AX
存储器寻址
直接寻址
- 根据操作数的存储单元的有效地址直接寻址
- 有效地址(EA):操作数的偏移地址 注[ ] 内的为地址
段基地址
1、默认DS
MOV AX ,[2050H] ;AX <-[DS16+2050H]。【物理地址】->数据->AX
2、段超越前缀(SS ,CS,ES)
MOV AX,ES:[2050H] ;AX<-[EX16+2050H]
3、符号地址
偏移地址通常以变量形式出现,在指令中直接写变量的名字
MOV SI,ADDR ;ADDR为一变量
寄存器间接寻址
操作数的偏移地址放在寄存器中。
- 能做间址寄存器只有SI、DI、BX和BP
寄存器相对寻址
EA=间址寄存器的内容加上一个8/16位偏移量
有效地址(偏移地址)=BX/BP/SI/DI+8/16位位移量
- 表示方式:
MOV AX,COUNT【BX】 - 等价写法
MOV AX,【BX+COUNT】
MOV AX,【COUNT+BX】
MOV AX,【BX】COUNT - 例子
基址变址寻址
由一个基址寄存器的内容和一个变址寄存器的内容相加而形成的操作数的偏移地址,
基址寄存器(BX或BP)———基址寻址方式
变址寄存器(SI或DI)————变址寻址方式
有效地址=BX/BP+SI/DI
等价表示
MOV AX ,[BX] [SI]
MOV AX,[BX+SI]
MOV AX,DS:[BP][SI]
相对基址变址寻址
在基址+变址寻址的基础上再增加一个8位或16位的偏移量
有效地址=BX/BP+SI/DI+8/16位位移量
等价表示
MOV AX ,[BX][SI]
MOV AX,[BX+SI]
MOV AX,DS:[BP][SI]