第三章 80x86的指令系统(二),,返回目录,二、算术运算类指令 p36,二 算术运算类指令,1. 加法指令 2. 减法指令 3. 乘法指令 4. 除法指令 5. 十进制调整指令,返回本节首页,算术指令的寻址方式:p36 双操作数指令的两个操作数中除源操作数为立即数的情况外,必须有一个操作数在寄存器中 单操作数指令不允许使用立即数方式1. 加法运算指令p36,(1)加指令ADD (add) (2) 带进位加指令ADC (add with carry) (3) 非压缩十进制数的加法校正指令AAA (4) 加法十进制校正指令DAA (5) 加1指令 INC (increment) (6) 交换并相加 XADD (exchange and add),返回本节首页,1.加法,(1)加法指令的一般格式 ADD dst, src 功能: dstdst+src 该指令对源操作数和目的操作数的内容执行一个字节或字的加法,并把结果放回原来存放目的操作数的地方 源操作数可以是立即数、寄存器或存储单元目的操作数可以是寄存器或存储单元 例如: ADD AL, 30H ;AL内容加立即数30H,结果存回到AL中 ADD AX, SI ;AX和SI两寄存器内容相加,结果存回到AX中 ADD [BX+DI], AX ;BX+DI和BX+DI+1两存储单元内容和AX内容相加,结果存回到上述两存储单元中,(2)带进位加法指令的一般格式,ADC dst, src 功能:dstdst+src+CF 该指令和ADD指令类似,只是在两个操作数相加时,要把标志寄存器中进位标志CF 的当前值加上去,结果放回原来存放目的操作数的地方。
该指令主要用于多字节运算中例如,见下页:,例如,有两个四字节的数相加,,加法要分两次进行, 先进行低两字节数相加, 然后再做高两字节数相加, 在高两字节数相加时,要把前两字节相加以后的进位考虑进去,就要用到带进位加法指令例1】无符号双字加法运算0234 4657H+ 0F0F 0F0FH MOV AX,4652H ;(AX)=4652H 送低字 MOV DX,0234H ;(DX)=0234H 送高字 ADD AX,0F0F0H ;(AX)=3742H,CF=1 加低字 ADC DX,0F0F0H;(DX)=0F325H,CF=0 加高字和进位,【例2】无符号双字加法运算,若两个四字节的无符号数,分别存放在首址为2000H和3000H的存储单元内,低位在前,高位在后,要求两数相加,结果存放在首址为2000H的单元中,可用如下程序段实现: MOV SI, 2000H ;第一个数首址送SI MOV AX, [SI] ;第一个数低16位送AX MOV DI, 3000H ;第二个数首址送DI ADD AX, [DI] ;两数低16位相加 MOV [SI], AX ;低16位数相加后的和存入2000H和2001H两存储单元中 MOV AX, [SI+2] ;第一个数高16位送AX ADC AX, [DI+2], ;两数高16位带进位加 MOV [SI+2], AX ;两高16位数带进位相加后的和存入2002H和2003H两单元,(3)非压缩十进制数的加法校正指令,所谓非压缩十进制数,就是把数字0 9的ASCII码的高四位置0以后形成的数码,如6为00000110,9为00001001。
两非压缩十进制数相加,要得到正确结果仍为非压缩十进制数,必须用AAA指令校正,结果存在AX中 AAA指令(ASCII Ajust for Addition)是对两个非压缩的十进制数相加后AL的和进行校正校正方法,如果AL的低4位大于9或(AF)=1,应校正:在AX寄存器内容上加106H,标志位AF和CF置1,并且AL高四位置0即: (AL)=(AL)+6 (AH)=(AH)+1 (AF)=(CF)=1 且AL高4位清零 否则:(CF)=(AF)=0,AL高4位清零 如在AL和BL中,如各存有一个非压缩BCD数相加,其和存在AL中也是非压缩BCD数,可用如下程序段: MOV AL,09H ;非压缩BCD数表示为0000 1001 MOV BL,06H ;非压缩BCD数表示为0000 0110 ADD AL, BL ;两数相加 ,结果为0000 1111,不是非压缩BCD数 AAA ;必须用AAA指令进行校正,最后结果为(AH)=0000 0001,(AL)=0000 0101,(AF)=(CF)=1,(4)加法十进制校正指令 DAA,所谓压缩十进制数,就是把数字0 9的ASCII码的低四位分别放在一个字节的高低四位后形成的数码,如63为0110 0011,39为0011 1001。
DAA指令(Decimal Adjust for Addition)是压缩型十进制数的加法校正指令,即AL存两位BCD数,DAA指令的校正和AAA指令类似,它必须考虑两位BCD数 方法是:如果AL的低四位所存值大于9,或标志位AF为1,则把AL加上6,并置标志位AF为1;如果AL的高四位所存值大于9,或标志位CF为1,则把AL加上60H,并置标志位CF为1 MOV AL,37H ;压缩十进制数37+49=86 ADD AL, 49H ;压缩十进制数应为86,但结果80H DAA ;校正后AL中得正确十进制数的结果86,【例2】压缩BCD码的加法运算MOV AL,68H ;(AL)=68H,表示压缩BCD码68 MOV BL,28H ;(BL)=28H,表示压缩BCD码28 ADD AL,BL ;(AL)=68H+28H=90H DAA ;十进制调整:(AL)=96H ;实现压缩BCD码加法:68+28=96,(5)加1指令 INC,INC dst 功能: dstdst+1 这条指令完成对指定的操作数加1,然后返回该操作数 此指令主要用于在循环程序中修改地址指针和循环次数等。
可用这条指令对字或字节内容加1 例如: INC CX ;寄存器中字加1,即(CX)+1→CX INC AL ;寄存器中字节加1,即(AL)+1→AL INC BYTE PTR [BX+DI+10H] ;BX+DI+10H所指的存储单元中字节加1,(6)XADD 交换并相加指令(386后),语句格式:XADD DST,SRC 功能: TEMP ← (DST)+(SRC) (SRC)← (DST) (DST)← TEMP 源操作数只能用寄存器寻址方式, 目的操作数则可用寄存器或任一种存储器寻址方式例3.47 XADD BL, DL 如指令执行前 (BL)=12H, (DL)=02H 则指令执行后 (BL)=14H, (DL)=12H,加法指令总结,1、三条加法指令都可作字或字节运算; 2、除INC指令不影响CF标志外,它们都影响条件标志位; 3 、条件标志位的影响见下:,返回本节首页,条件标志位的影响,3 、条件标志位最主要的是CF、ZF、SF、 OF ①运算结果为零,则ZF=1,否则ZF=0; ②运算结果为负,则SF=1,否则SF=0; ③运算有进位时,CF=1,否则CF=0; ④两操作数的符号相同,而结果的符号与之相反时,OF=1(有溢出),其余情况OF=0。
下面举例说明CF 、 OF的设置情况数的溢出,CF位则可用来表示无符号数的溢出,OF位可以用来表示带符号数的溢出 (1)带符号数和无符号数都不溢出 二进制加法 看作无符号数 看作带符号数 0000 0100 4 +4 + 0000 1011 + 11 +(+11) 0000 1111 15 +15 CF=0 OF=0 (2)无符号数溢出 二进制加法 看作无符号数 看作带符号数 0000 0111 7 +7 + 1111 1011 + 251 +(-5) 0000 0010=+2 258 +2(结果对) 1 CF=1 OF=0 两个正数相加,应为正数+258(大于+255,有进位,CF=1 ), 现为+2,结果错,,,,,,,,,(3)带符号数溢出( OF位可以用来表示带符号数的溢出,OF=1) 二进制加法 看作无符号数 看作带符号数 0000 1001 9 +9 + 0111 1100 + 124 +(+124) 1000 0101 133 +133 CF=0 OF=1 两个正数相加,应为正数+133(大于+127,所以OF=1 ), 现为-123,结果错,,,,,(4)带符号数和无符号数都溢出( CF位和OF位均为1) 二进制加法 看作无符号数 看作带符号数 1000 0111 135 (-121) + 1111 0101 + 245 +(-11) 0111 1100= (124D) 380 -132 1 CF=1 OF=1 两个负数相加,应为负数-132(小于-128,所以OF=1 ), 现为+124,结果错,,,,,,例 ADD DX, 0F0F0H,如指令执行前 (DX)=4652H 则 4652 0100 0110 0101 0010 + F0F0 + 1111 0000 1111 0000 0011 0111 0100 0010 1 指令执行后(DX)=3742H,ZF=0,SF=0,CF=1,OF=0,,,,例3.46,例3.46 ADD AX, CX ;两个双精度数的加法。
ADC DX, BX ; (AX)=0F365H 1111 0011 0110 0101 (CX)=0E024H + 1110 0000 0010 0100 (AX)=0D389H 1101 0011 1000 1001 CF= 1 则第一条指令执行后(AX)=0D389H,SF=1,ZF=0,CF=1,OF=0 (BX)=0005H 0000 0000 0000 0101 (DX)=0E024H 0000 0000 0000 0010 CF= + 1 (DX)=0008 0000 0000 0000 1000 第二条指令执行后(DX)=0008H,SF=0,ZF=0,CF=0,OF=0 因此该指令系列执行后(DX)=0008H, (AX)=0D389H 结果正确,,,,2. 减法运算指令,(1)减指令SUB (2)带借位减指令 SBB (3)非压缩十进制减法校正指令 AAS (4)减法十进制校正指令 DA。