大多数指令既可以处理字数据,也可以处理字节数据。
算术运算和逻辑运算不局限于寄存器,存储器操作数也可以直接参加算术逻辑运算。
指令系统分为如下六个功能组:
(1)数据传送
(2)算术运算
(3)逻辑运算
(4)串操作
(5)程序控制
(6)处理器控制
指令的一般格式分为四个部分
[标号:] 指令助记符 [操作数1][,操作数2][;注释]
指令是否带有操作数完全取决于指令
标号的使用取决于程序的需要,但是不被汇编程序识别,与指令系统无关。
标号有点类似于C语言中的goto语句中的标号,做为一个偏移。
指令助记符代表操作码,从二进制的操作码到助记符的一个翻译过程。
功能组一:数据传送指令
1、传送指令格式:
MOV DST(目的操作数),SRC(源操作数)
源操作数:累加器(AX),寄存器,存储单元和立即数
目的操作数:不能是立即数
操作后不改变源操作数。
(1)CPU内部之间的传送(两个都是寄存器)
MOV AH,AL
MOV DL,DH
MOV BP,SP
MOV AX,CS
源操作数和目的操作数两个不能都是段寄存器
代码段(CS)不能作为目的操作数
指令指针(IP)既不能作为源操作数也不能作为目的操作数
(2)立即数送通用寄存器和存储单元
MOV AL,3
MOV SI,-3
MOV VARB,-1;VARB是变量名,代表一个存储单元
MOV VARW,3456H;VARW是一个字变量
MOV [SI],6543H
主要:立即数不能直接传送给段寄存器
立即数不能是目的操作数
(3)寄存器与存储器之间的数据传送
MOV AX,VARW ;VARW是一个字变量,为直接寻址
MOV BH,[DI];为寄存器间接寻址
MOV DI,ES:[SI+3];为寄存器相对寻址,段超越前缀
MOV VARB,DL;为寄存器直接寻址
MOV DS:[BP],DI;寄存器基址变址寻址
MOV VARW,DS;寄存器直接寻址
MOV ES,VARW;直接寻址
注意:
源操作数和目的操作数类型一样(byte和word等),除了串操作外
不能同时是存储器操作数,两个操作数必须有一个寄存器除立即寻址以外。
如果需要在两个存储单元中进行数据传送,可以利用一个寄存器过渡
MOV AX,VARW1
MOV VARW2,AX
实现了VARW1->VARW2的数据传送。
操作数不能同时为段寄存器,那么同上也可以进行过渡。
MOV BX,OFFSET TABLE
把TABLE的偏移地址送到BX寄存器中,其中OFFSET为属性操作符。
传送指令不影响FLAG寄存器
2、交换指令
利用交换指令可以方便的实现通用寄存器之间或者是与存储器之间的数据交换
指令格式:
XCHAG OPRD1,OPRD2
此指令把操作数OPRD1与OPRD2的内容进行交换必须保证数据类型的一致。
通过上面的分析,操作指令中必须有一个寄存器,并且存储器之间,段寄存器之间不能直接通过MOV进行操作。
例如:
XCHAG AL,AH
XCHAG SI,BX
OPRD可是通用寄存器和存储单元,但是不能包括段寄存器<一定要通过通用寄存器来交换>
还不能有立即数,可以采用各种寄存器和存储器的寻址方式。
指令示例:
XCHAG BX,[BP+SI]; 基址加变址寻址方式,基址寄存器和存储器的数据呼唤[SS]
此指令不影响FLAG
3、地址传送指令
(1)指令LEA( load effective Address)
传送有效地址指令,格式如下:
LEA REG,OPRD
该指令把操作数OPRD的有效地址传送到操作数REG中。
操作数OPRD必须是一个存储器操作数
操作数REG必须是一个16位的通用寄存器(AX BX CX DX BP SP DI SI)
操作的结果是把偏移地址送给REG,记住不是物理地址,是偏移地址
指令示例:
LEA AX, BUFFER [AX]=BUFFER
LEA DS,[BS+SI] [DS] = BS+SI
LEA SI,[BP+DI+4] [SI] = BP+DI+4
(2)LDS( Load pointer into DS)
段值和段内偏移构成32位的地址指针。
该指令传送32为地址指针,其格式如下:
LDS REG, OPRD
执行操作: (REG) <- (SRC)
(DS) <- (SRC+2)
该指令把操作数OPRD作为基址所含的一个32位的内存中的内容前两个字节送到REG中,后两个字节送到数据段寄存器DS
操作数OPRD必须是一个32为的存储器操作数,
操作数REG可以是一个16位的通用寄存器,但实际使用的往往是变址寄存器或者是指针寄存器。
(3)LES(Load pointer into ES)
操作和上面的完全相同。