1.加法指令ADD
格式:ADD OPRD1, OPRD2
操作:OPRD1<-OPRD1+OPRD2
加法指令影响标志位,OF位更具操作数符号变化情况来设置:若两个操作数符号相同而结果与之相反时溢出,OF=1,否则OF=0。
CF可以用来表示无符号数的溢出,最高位产生进位或借位,产生溢出,CF=1。
2.带进位的加指令ADC
格式:ADC OPRD1, OPRD2
操作:OPRD<-OPRD1+OPRD2+CF
ADD AX, CX
ADD DX, BX
为实现双精度加法,必须使用两条指令完成低位字和高位字加法,在使用高位字相加时,应用ADC把前一条ADD作低位字加法所产生的进位值加入高位字之内,带符号的双精度溢出,应根据ADC的OF位来判断。
3.加1指令INC
格式:INC OPRD
操作:OPRD<-OPRD+1
操作数可以使通用寄存器,存储单元,影响标志位ZF,SF,OF,PF和AF,但不影响CF,该指令主要用于调整地址指针和计数器。
4.减法指令SUB
格式:SUB OPRD1,OPRD2
操作:OPRD1<-OPRD1-OPRD2
减法溢出:若两个数的符号相反, 而结果符号与减数相同则OF=1,结果溢出。
5.带进位减指令SBB
格式:SBB OPRD1, OPRD2
操作:OPRD1<-OPRD1 – OPRD2 – CF
例:
SBB AL, DL
SBB DX, AX
该指令主要用于多字节数相减。
6.减1指令DEC
DEC OPRD
操作:OPRD<-OPRD-1
例:
DEC VARB
操作数可以使通用寄存器,也可是存储单元,在相减时,把操作数作为一个无符号数对待。这条指令执行的结果影响ZF,SF,OF,PF,AF,不影响CF。
该指令主要用于调整地址指针和计数器。
7.取补指令NEG
格式:NEG OPRD
操作:OPRD<- -OPRD
该指令对操作数取补,就是用0减去操作数,再把结果送回操作数。
若在字节操作时对128取补,或在字操作对32768取补,则操作数不变,但OF被置为1,其他均为0.
操作数可以是通用寄存器,也可是存储单元,此指令执行结果影响CF,ZF,SF,OF,AF,PF.
操作数为0时,运算结果使CF=0,其他情况则均为1.
8.比较指令CMP
格式:CMP OPRD1, OPRD2
操作数OPRD1减去OPRD2,运算结果不送到OPRD1,但影响标志CF,ZF,SF,OF,AF,PF。
执行比较指令后,可根据ZF是否置位,判断两者是否相等,若两者是无符号数,则根据CF判断大小;若为有符号数,则根据SF OF判断大小。
乘除运算指令分为有符号数和无符号数运算指令。
1.乘法指令
一个操作数总是因旱灾寄存器AL或AX中,另一个操作数可以采用立即数方式以外的任一种寻址方式。
(1)无符号乘法MUL
格式:MUL OPRD
两个8位相乘得16位放在AX中,两个16位相乘得32位乘积放到DX,AX, DX存放高位字。
若乘积结果高半部分(字节相乘时为AX, 字相乘时为DX)不等于0,则标志CF=1,OF=1,否则CF=0, OF=0,所以若CF=1和OF=1表示AH或DX中含有结果的有效数,该指令对其他标志位无定义。
(2)有符号乘法指令IMUL
若乘积结果的高半部分不是低半部分符号扩展,则标志CF=1,OF=1,若CF=1,OF=1表示在AH或DX中含有结果的有效数,该指令对其他标志位无定义。
2.除法指令
除数总是因旱灾寄存器AX(除数是8位)或者DX和AX(除数是16位)中,另一个操作数可以采用除立即数方式外任意一种寻址方式。
(1)无符号数除法指令DIV
除以8位,商放在AL中,余数放在AH中。
除以16位,商放在AX,余数放在DX中。
若除数为0,或者在8位数除时超过8位,或者16位除时超过16位,则认为是除溢出,引起0号中断。
除法指令对标志位影响无定义。
(2)有符号数除法IDIV
当除数位0,或太大(字节除时超过127,字时超过32767),或者商太小(-127,-3267),则引起0号中断。
3.符号扩展指令
由于除法指令隐含使用字被除数或双字被除数,所以当除数位字节,或者除数和被除数为字时,需要在除操作前扩展被除数。
(1)字节转换为字指令CBW
例:
MOV AX, 3487H ;AH=34H AL=87H
CBW ;AH=0FFH, AL=87H
这条指令不影响各标志位。
(2)字转换为双字指令CWD
例:
MOV AX, 4567H ;AX=4567H
CWD ;AX=4567H, DX=0