·加1 INC OPR
操作:(OPR)←(OPR)+ 1 说明:
·三条指令都可以作字或字节运算,386及其后继机还可进行双字操作。
·除INC指令不影响CF外,运算后都要建立条件标志。
条件标志中,最主的是CF、ZF、SF、OF四个标志位。下面进一步分析CF和OF位设置。 一个8位或16位二进制数,在程序中既可认为是无符号数,也可以认为是带符号数,分析运算溢出有二个条件: (1)加数和被加数都必须同时为无符号数或带符
号数。
(2)程序中用检测不同标志位的方法区别这二类
数运算结果是否溢出。
这二个条件同样适用于减法运算。
8位二进制数加法运算溢出情况分析:P.60(4) 87H + 0F5H = 7CH 执行后 CF = 1 OF = 1 SF= 0 ZF = 0
AF = 0 PF = 0
37
二种情况和都超范围,溢出。 分析:
·看作无符号数相加 87H = 135 F5H = 245
135 + 245 = 380 = 256 + 124 相加后的和为 7CH = 124
将进位CF=1以28 = 256 为权值考虑在内,得到的和是正确的,和为9 位二进制数.
·看作带符号数相加 87H = -121 F5H = -11
87H + F5H = (-121) + (-11) = -132
因为 –132 小于-128 超出范围,产生负溢出, 使和成为正数 7CH,结果错误。 结论:
·CF = 1,表示无符号数运算产生溢出,此时不属于出错,CF所保存的进位值是有用的。在多字节运算中,利用CF位传递低位字节向高位字节的进位。
·OF = 1,表示带符号数运算溢出,结果错误。
例3.45 ADD DX,0F0F0H
38
操作:(DX)←(DX)+(F0F0H) 说明:立即数用十六进制书写,若第一个数是字母,
前面必须加“0”,保证语法正确。 若指令执行前(DX)= 4652H 加法运算:
4652H + F0F0H = 3742H
指令执行后
(DX)= 3742H, ZF = 0 SF = 0 CF = 1 OF = 0
看作带符号数相加,DX值是正数,F0F0H 是负数,正数加负数,和不会溢出。
例3.46 二个双精度数(双字长数)的加法运算 设目的操作数在DX、AX中,DX存放高位字 源操作数在BX、CX中,BX存放高位字。 操作如下图: 15 0 15 0
加数 DX AX
加数 BX CX +
和 DX AX
39
分析:一个双字长数,高位字的最高位是符号位,低位字是无符号数,加法运算先加二个低位字,然后用CF传送进位。
双字加法指令序列为: ADD AX,CX ;(AX)←(AX)+(CX) 低位字相加 ADC DX,BX ;(DX)←(DX)+(BX)+ CF
高位字带进位加
最终的标志位状态由ADC指令执行结果决定。
二、减法指令
·减法 SUB DST,SRC
操作:(DST)←(DST)―(SRC)
·带借位减法 SBB DST,SRC
操作:(DST)←(DST)―(SRC)― CF
·减1 DEC OPR
操作:(OPR)←(OPR)―1 ·求补 NEG OPR
40