8806/8088 CPU提供加、减、乘、除四种基本算术运算的指令。这些操作都可用于字节或字的运算,也可以用于带符号数或无符号数的运算。带符号数的运算都采用补码形式表示。另外还提供了各种十进制调整操作,便于十进制运算。
1.加法指令
(1)加指令
指令格式:ADD OPD,OPS
功能:(OPS)+(OPD)→OPD,即完成两个操作数相加,结果送至目的地址,而源地址中的内容并不改变。
对标志位的影响:加法指令运算结果将影响标志位CF、OF、PF、SF、ZF和AF。
例3-14设(AX)=OFFFDH(即-3的补码),说明指令ADD AX,-7FFFH的执行结果。
执行:(AX)+[-7FFFH]补=OFFFDH+800lH=7FFEH
执行后:(AX)=7FFEH
两负数相加,结果为正,运算产生了溢出,结果是错误的,因而OF=l。又由于从最高位向前产生了进位,所以CF=l。
(2)带进位加指令
指令格式:ADC OPD,OPS
功能:(OPD)+(OPS)+CF→OPD,即完成两个操作数以及指令执行前进位标志位CF三者相加,结果送至目的地址,而源地址中的内容并不改变。
对标志位的影响:带进位加法指令运算结果将影响标志位CF、OF、PF、SF、ZF和AF。
由于计算机单个字长所能表示的数的范围小、精度低,不能满足多方面的要求,为了解决这个问题,一种有效的方法就是采用两个字(32位)来存放一个数,称为双精度数。当然,也可以根据需要用更多的字或字节来存放一个数,这就是多倍精度数。带进位加指令ADC为多倍精度数的加运算提供了方便。
例3-15 两个双精度数相加。
(3)加1指令
指令格式:INC OPD
功能:(OPD)+l→OPD
对标志位的影响:指令执行结果不影响进位标志CF,影响OF、PF、SF、ZF和AF。
例如:
注意:单操作数或形式上的单操作数指令,其操作数不能是立即数,且操作数的类型必须明确。例如INC、DEC、PUSH、POP以及乘、除法指令。
2.减法指令
(1)减指令
指令格式:SUB OPD,OPS
功能:(OPD)-(OPS)→OPD,即完成两个操作数相减,结果送至目的地址,而源地址中的内容并不改变。
对标志位的影响:减法指令运算结果将影响标志位CF、OF、PF、SF、ZF和AF。
例如:
(2)带进位减指令
指令格式:SBB OPD,OPS
功能:(OPD)-(OPS)-CF→OPD,即完成两个操作数相减,同时还要减去指令执行前的进位标志位CF,结果送至目的地址,而源地址中的内容并不改变。
对标志位的影响:带进位减法指令运算结果将影响标志位CF、OF、PF、SF、ZF和AF。
该指令可用于多倍精度数的减运算。
(3)减1指令
指令格式:DEC OPD
功能:(OPD)-l→OPD
对标志位的影响:指令执行结果不影响进位标志CF,影响OF、PF、SF、ZF和AF。
(4)求补指令
指令格式:NEG OPD
功能:将目的操作数的每一位取反(包括符号位)后加1→OPD
对标志位的影响:指令执行结果影响标志位CF、OF、PF、SF、ZF和AF。
说明:这里的求补实际的结果是对原来数值求相反数。
(5)比较指令
指令格式:CMP OPD,OPS
功能:(OPD)-(OPS),即进行目的操作数与源操作数减操作,然后根据相减的结果设置标志位,但该结果并不存入目的地址。
对标志位的影响:指令执行结果影响标志位CF、OF、PF、SF、ZF和AF。
该指令执行后,源地址和目的地址中的内容均不改变。在一般情况下,此指令的后面常常是条件转移指令。例如:
上述指令的功能是比较AX与0的关系,如果相等则转移至标号NEXT处。
利用比较指令可判断两个数的大小。应用ZF来判断两个数是否相等,若ZF=1,则两数相等;若ZF=0,则两数不相等。当两个无符号数比较时,应用CF来判断大小,若CF=1,则OPD<OPS;若CF=0,则OPD≥OPS。当两个有符号数比较时,要同时使用OF和SF来判断大小,若OF与SF同号,则OPD≥OPS;若OF与SF异号,则OPD<OPS。
3.乘法指令 (www.xing528.com)
在8086/8088中,乘、除法运算分为无符号数运算和有符号数运算。
(1)无符号数乘指令
指令格式:MUL OPS
功能:字节乘法:(AL)*(OPS)→AX
字乘法:(AX)*(OPS)→DX,AX
对标志位的影响:如果乘积的高位即在AH或DX中包含有乘积的有效位,则CF=OF=1;否则,CF=OF=0。对其他的运算结果标志未定义。
说明:乘运算指令属双操作数指令,但在语句中却只指定源操作数(乘数),而另一个操作数是隐含的,在累加器AL或AX中。另外,参与运算的数和结果均为无符号数。
例3-16编程实现无符号数乘法25×8,结果存放在AX中。
(2)有符号数乘指令
指令格式:IMUL OPS
功能:字节乘法:(AL)*(OPS)→AX
字乘法:(AX)*(OPS)→DX,AX
对标志位的影响:如果乘积的高位(字节相乘指AH,字相乘指DX)不是低位的符号扩展,即AH或DX中包含有乘积的有效位,则CF=OF=1;否则,CF=OF=0。对其他的运算结果标志未定义。
说明:该指令的使用格式与MUL相同,只是参与运算的数和结果均为有符号数。
例3-17 编程实现有符号数乘法(-259)×(+86),结果存放在DX:AX中。
4.除法指令
(1)无符号数除法指令
指令格式:DIV OPS
功能:字节除法:(AX)/(OPS)→AL(商)、AH(余数) 字除法:(DX,AX)/(OPS)→AX(商)、DX(余数)
对标志位的影响:未定义。
例3-18编程实现无符号数除法运算500÷23。
例3-19 编程实现无符号数除法运算1000÷512。
(2)有符号数除法指令
语句格式:IDIV OPS
功能:字节除法:(AX)/(OPS)→AL(商)、AH(余数)
字除法:(DX,AX)/(OPS)→AX(商)、DX(余数)
对标志位的影响:未定义。
说明:商的符号按有符号数除法规则确定(即同号相除为正,异号相除为负),余数的符号与被除数的符号相同。
例3-20编程实现有符号数除法运算(-1000)÷512。
5.符号扩展指令
(1)字节转换为字指令
指令格式:CBW
功能:将AL中的符号扩展到AH中,即若AL的最高位为0,则AH=00H;若AL的最高位为1,则AH=0FFH。
(2)字转换为双字指令
指令格式:CWD
功能:将AX中的符号扩展到DX中,即若AX的最高位为0,则DX=0000H;若AX的最高位为1,则DX=0FFFFH。
6.十进制调整指令
8086/8088提供了一组十进制数调整指令,这组指令在二进制数计算的基础上,给予十进制调整,可以得到十进制的结果。通常表示十进制数使用的BCD码有两种格式,即压缩的BCD码和非压缩的BCD码。
(1)压缩的BCD码调整指令
DAA 加法的十进制调整指令
DAS 减法的十进制调整指令
说明:在对BCD码数使用加、减法指令运算后分别使用以上两条指令进行调整,才能得到正确的结果。
(2)非压缩的BCD码调整指令
AAA 加法的十进制调整指令
AAS 减法的十进制调整指令
AAM 乘法的十进制调整指令
AAD 除法的十进制调整指令
例3-21 编程实现十进制加法运算7+9,用非压缩BCD码表示。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。