算术运算指令
1.)加法指令
不带进位加法指令 ADD
格式:ADD 目的操作数,源操作数
功能:将源操作数加到目的操作数上。
说明:源操作数和目的操作数类型必须一致,并且两者不能同为存储器操作数(这一点适合于所有双操作数的算术运算指令)。影响标志位 OF、SF、ZF、AF、PF、CF。
eg:
MOV AL,05CH
MOV BL,3BH
ADD AL,BL
;将 AL 寄存器于 BL 寄存器的内容相加,结果送入 AL 寄存器。
带进位加法指令 ADC
格式:ADC 目的操作数,源操作数
功能:与 ADD 基本相同,区别在于执行指令前将标志位 CF 的值加到目的操作数上。多用于多字节加法运算。
eg:
MOV DX,2FFFH
MOV AX,0FF00H
ADD AX,5678H
ADC DX,1234H
该指实现多字节数 2FFFFFF00H 与 12345678H 相加,DX 中存放高8位 2FFFH 和 1234H,AX 中存放低8位 FF00H 和 5678H,执行第三步时,低8位进行相加,FF00H+5678H =5578H ,此时进位标志位 CF=1,执行第四部时,高8位进行相加,2FFFH+1234H=4233H,之后加上进位标志位的进位数, DX = 4234H。
加1指令 INC
格式:INC 目的操作数
功能:将目的操作数加1。
2.)减法指令
不带借位减法指令 SUB
格式:SUB 目的操作数,源操作数
功能:对目的操作数进行减去源操作数。
eg:
MOV AX,0C500H
MOV BX,1234H
SUB AX,BX
;将 AX 寄存器与 BX 寄存器的内容相减,结果送入 AX 寄存器。
带借位减法指令 SBB
格式:SBB 目的操作数,源操作数
功能:与 SUB 基本相同,区别在于执行指令后将标志位 CF 的值也减去。
eg:
MOV DX,2FFFH
MOV AX,0FF00H
SUB AX,5678H
SBB DX,1234H
该指实现多字节数 2FFFFFF00H 与 12345678H 相减,DX 中存放高8位 2FFFH 和 1234H,AX 中存放低8位 FF00H 和 5678H,执行第三步时,低8位进行相减,FF00H-5678H =A888H ,此时进位标志位 CF=0,执行第四部时,高8位进行相减,2FFFH-1234H=1DCBH,之后减去进位标志位的内容, DX = 0A888H,AX = 1DCBH。
减1指令 DEC
格式:DEC 目的操作数
功能:将目的操作数减1。
取补指令 NEG
格式:NEG 目的操作数
功能:对目的操作数取补码,相当于用0减去目的操作数,结果送回目的操作数。
比较指令 CMP
格式:CMP 目的操作数,源操作数
功能:利用目的操作减去源操作数的结果设置标志位,但运算结果不送回目的操作数。
3.)乘法指令
无符号乘法指令 MUL
格式:MUL 源操作数
功能:实现无符号乘法运算,若源操作数为字节操作数,则将 AL 与源操作数的乘积送入寄存器 AX ;若源操作数为字操作数,则将 AX 与源操作数乘积的高两字节送入寄存器 DX,低两字节送入寄存器 AX。
有符号乘法指令 IMUL
格式:IMUL 源操作数
功能:实现有符号乘法运算,若源操作数为字节操作数,则将 AL 与源操作数的乘积送入寄存器 AX ;若源操作数为字操作数,则将 AX 与源操作数乘积的高两字节送入寄存器 DX,低两字节送入寄存器 AX。
4.)除法指令
无符号除法指令 DIV
格式:DIV 源操作数
功能:实现无符号除法运算,若源操作数为字节操作数,则将寄存器 AX 的内容除以源操作数的商送入 AL ,余数送入 AH ;若源操作数为字操作数,则寄存器 DX ,AX的内容连接成的双字数据除以源操作数的商送入 AX,余数送入 DX。
eg:
DIV BL
;(AX)/(BL) → AL,余数送入 AH
DIV BX
;(DX,AX)/(BL) → AX,余数送入 DX
DIV WORD PTR [SI]
;(DX,AX)/((SI)) → AX,余数送入 DX
有符号乘法指令 IDIV
格式:IDIV 源操作数
功能:实现有符号除法运算,若源操作数为字节操作数,则将寄存器 AX 的内容除以源操作数的商送入 AL ,余数送入 AH ;若源操作数为字操作数,则寄存器 DX ,AX的内容连接成的双字数据除以源操作数的商送入 AX,余数送入 DX。
符号位扩展指令:
格式:CBW
功能:将寄存器 AL 中的数据的符号位扩展到 AH 中,若 AL 中的最高位(符号位)为0,则 AH == 00H,若 AL 中的最高位(符号位)为1,则 AH == 0FFH。
格式:CWD
功能:将寄存器 AX 中数据的符号位扩展到 DX 中。
逻辑运算和位移指令
1.)逻辑运算
按位取反指令 NOT
格式:NOT 目的操作数
功能:对目的操作数按位取反,结果送回目的操作数。
eg:
MOV AH,12H
NOT AH
执行后,AH = 0EDH, 12H 转换为 二进制为 00010010 ,按位取反为 11101101,转换为16进制为 0EDH。
按位与运算指令 AND
格式:AND 目的操作数,源操作数
功能:对目的操作数和源操作数执行按位的逻辑与操作,结果送回目的操作数。
AND 指令常用于将寄存器或存储器操作数指定位清0。
按位或运算指令 OR
格式:OR 目的操作数,源操作数
功能:对目的操作数和源操作数执行按位的逻辑或操作,结果送回目的操作数。
OR 指令通常用于将寄存器或存储器操作数指定位置1。
按位异或运算指令 XOR
格式:XOR 目的操作数,源操作数
功能:对目的操作数和源操作数执行按位的逻辑异或操作,结果送回目的操作数。
XOR 指令通常用于将寄存器清0。
测试指令 TEST
格式:TEST 目的操作数,源操作数
功能:对目的操作数和源操作数执行按位的逻辑与操作,但结果不送回目的操作数。
TEST 指令常用于测试寄存器或存储器操作数的指定位内容是否为1。
2.)移位指令
移位指令包括算术移位指令、逻辑移位指令和循环移位指令。移位指令必须在格式中指明目的操作数和移位次数,移位次数只能为1或由 CL 的内容规定,当要移多个为时,移位位数需存放在 CL计数寄存器中。
算术移位指令
算术左移指令 SAL
格式:SAL 目的操作数,移位次数
功能:将目的操作数左移指定出次数,没左移一次,最低位补0,最高位送入 CF。对于有符号位数,每左移一次相当于乘2。
算术右移指令 SAR
格式:SAR 目的操作数,移位次数
功能:将目的操作数右移指定的次数,没右移一次,最高位保持不变,最低位送入 CF 。对于有符号位数,每右移一次相当与除2。
逻辑移位指令
逻辑左移指令 SHL
格式:SHL 目的操作数,移位次数
逻辑右移指令 SHR
格式:SHR 目的操作数,移位次数
逻辑移位指令通常用于无符号位数乘2、除2运算。
循环移位指令
循环左移指令 ROL
格式:ROL 目的操作数,移位次数
功能:将目的操作数右移指定的次数,每左移一次,左移前的最高位送入最低位以及 CF 。
循环右移指令 ROR
格式:ROR 目的操作数,移位次数
功能:将目的操作数右移指定的次数,每右移一次,右移前的最低位送入最高位以及 CF 。
带进位的循环左移指令 RCL
格式:RCL 目的操作数,移位次数
功能:将目的操作数左移指定的次数,每左移一次,左移前的最高位送入 CF ,CF 的内容送入最低位。
带进位的循环右移指令 RCR
格式:RCR 目的操作数,移位次数
功能:将目的操作数右移指定的次数,每右移一次,右移前的最低位送入 CF ,CF 的内容送入最高位。
处理器控制指令
处理器控制指令包括标志操作指令和 CPU 控制指令。
标志操作指令是一组可以对标志寄存器中的指定标志位进行设置的指令,都是零操作数指令。
STC :置 CF = 1
CLC :置 CF = 0
CMC :将 CF 取反
STD :置 DF = 1
CLD :置 DF = 0
STI :置 IF = 1
CLI :置 IF = 0
CPU 控制指令
空操作指令 NOP
功能:执行一次空操作,消耗 CPU 时间。
停机指令 HLT
功能:使 CPU 处于暂停状态,等待中断或复位。
锁总线指令 LOCK
功能:封锁总线,使指令执行原子操作,用于多处理器并行系统。