目录
1.加法指令ADD/ADC、INC
普通加法指令ADD
指令格式:ADD OPRD1,OPRD2 ;OPRD1←OPRD1+OPRD2
功能:将源操作数和目的操作数相加,结果送到目标操作数
注意:
- 这里源操作数和目标操作数都可以是无符号数,也可以是带符号数,但两者类型要相同,长度相同
- 源操作数可以是通用寄存器、存储器或立即数,而目的操作数只能是通用寄存器或存储器,不能是立即数,且两者不能同时为存储器操作数。
ADD CL,20H ;CL←CL+20H
ADD DX,[BX+SI] ;DX←DX+[BS+SI]
带进位加法指令ADC
指令格式:ADC OPRD1,OPRD2 ;OPRD1←OPRD1+OPRD2+CF
功能:ADC和ADD指令在功能、格式以及对标志位的影响上基本相同,只是在求和运算时加入了CF标志位,结果依然送目标操作数
;当CF=1
MOV AL,7EH
ADC AL,0ABH ;执行完之后AL=2AH=7eH+0ABH+1且CF=1
加1指令INC
指令格式:INC OPRD ;OPRD←OPRD+1
功能:INC指令是将指定操作数的内容加1,再送回该操作数。其操作类似c语言中的"++"运算符。
注意:
- 目的操作数可以是任意一个8位或16位通用寄存器或存储单元,但不能是立即数,且把操作数看作是无符号二进制数。
- 指令执行影响PF、AF、ZF、SF、OF,但不影响CF
INC SI ;修改地址指针
INC BYTE PYR [BX] ;修改地址指针
2.减法指令SUB/SBB
不考虑借位减法指令SUB
指令格式:SUB OPRD1,OOPRD2 ;OPRD1←OPRD1-OPRD2
功能:SUB是一条双操作数指令,其功能是用目标操作数减去源操作数,并将结果送至目标操作数。
注意:该指令对标志位的影响和ADD完全相同。
SUB BL,30H ;BL←BL-30H
SUB AL,[BP+SI] ;AL←AL-[BP+SI]
考虑借位的减法指令SBB
指令格式:SBB OPRD1,OPRD2 ;OPRD←OPRD1-OPRD2-CF
功能:目标操作数减去源操作数以及标志位CF的值,并将结果送至目标操作数所在地址。
注意:该指令对于标志位的影响和SUB相同,主要用于多字节减法运算
SBB BL,30H ;BL←BL-30H-CF
减1指令DEC
指令格式:DEC OPRD ;OPRD←OPRD-1
功能:DEC和INC功能一样,是一条单字节指令,其功能是将操作数的值减1,结果送回操作数的地址。
注意:该指令对于标志位的影响和INC相同
DEC AX ;AX←AX-1
DEC BYTE PTR[DI] ;将数据段中DI所指单元的内容减1,结果送回该单元
比较指令CMP
指令格式:CMP OPRD1,OPRD2 ;OPRD1-OPRD2,结果不送回
功能:CMP指令是用目标操作数减源操作数,但相减的结果不送回目标操作数,即指令执行后的两操作数内容不变,对6个状态标志位的影响和SUB相同。常在其后跟一个条件转移指令,用于程序跳转。
求补指令NEG
指令格式:NEG OPRD ;OPRD ←0-OPRD
功能:对操作数求补,该指令执行效果是改变操作数的符号---将正数变为负数或将负数变为正数,大小不变。因此该指令也叫取负指令。
MOV AL,FFH
NEG AL ;AL=0-FFH=01H
3.乘法指令MUL
指令格式:MUL OPRD ;AX←OPRD*AL (字节乘法)
;DS:AX←OPRD*AX (字乘法)
IMUL OPRD ;和MUL相同
功能:MUL和IMUL用于无符号数和有符号数的乘法运算,他们都是有一个源操作数,而目标操作数都是隐含规定的:8位乘法时隐含操作数为AL, 16位乘法时隐含的操作数为AX。
注意:
- 指令MUL对标志位CF、OF有影响,而对SF、ZF、AF、PF不确定,如果运算结果的高半部分(在AH或DX中)为零,则CF=OF=0,表示AH或DX中所存的结果为有效数字;否则CF=OF=1,表示AH或DX中结果为无效数字。
- 指令IMUL对标志位的影响与MUL类似,由于指令IMUL将两个操作数按带符号数进行处理,如果乘积的高半部分仅是低半部分符号位的扩展,则CF=OF=0,f否则,AH或DX的内容为乘积的有效数字。
MOV AX,04E8H ;(AX)=04E8H
MOV BX,4E20H ;(BX)=4E20H
IMUL BX ;(DX:AX)=(AX)*(BX)
4.除法指令DIV
指令格式:DIV OPRD ; AL←(AX)/(OPRD)的商 ----- (字节除法)
;AH←(AX)/(OPRD)的余数
;AX←(DX:AX)/(OPRD)的商 ---- (字除法)
;DX←(DX:AX)/(OPRD)的余数
IDIV OPRD ;与DIV格式相同
功能:DIV和IDIV指令用于无符号数和有符号数的除法运算,只有一个源操作数,而目标操作数时隐含规定的:若被除数为16位,则隐含操作数为AX,其中,8位商放在AL中,8位余数放在AH中;若被除数为32位,则隐含的操作数为DX:AX,其中,16位商在AX中,16位余数在DX中。
注意:
- 指令DIV/IDIV使状态标志位的值不确定
- 除法指令中被除数的长度应为除数长度的两倍。如果被除数长度和除数长度相等,则应在使除法指令之前,将被除数的高位进行扩展,确保在使用DIV指令时,高位扩展为8个零或者16个零。
DIV BL ;AX除以BL,商放AL,余数放AH
DIV WORD PTR[SI] ;DX:AX除以SI和SI+1所指向单元的内容,商放AX,余数放DX