一、算术运算指令算术运算中的溢出问题以8位二进制数的加法为例,两个8位数相加时有4种情况:二进制运算对应的十进制运算数据作为无符号数Case1:无符号数和有符号数均不溢出000010000001111000100110结果26H38CF0OF0Case2:无符号数溢出,有符号数不溢出0000100011111101100000101结果:5CF1OF0Case3:无符号数不溢出有符号数溢出000010000111110110000101结果:123补码CF0OF1Case4:无符号数和有符号数均溢出1000100011110111101111111结果:127CF1OF183038未超出8位无符号二进制数表示范围8253261超出8位无符号二进制数表示范围8125133未超出8位无符号二进制数表示范围136247383超出8位无符号二进制数表示范围3038未超出8位有符号二进制数表示范围8(3)5未超出8位有符号二进制数表示范围8(125)133超出8位有符号二进制数表示范围120(9)129超出8位有符号二进制数表示范围数据作为有符号数8
上面四种情况说明,算术运算溢出的判别是比较复杂的,不能只用一个标志位来判别。算术运算溢出是一种出错状态,在运算过程中应当避免。1加法运算指令【例1】ADDCL,20HCL←CL20HADDAX,SIAX←AXSIADDBX2,ALBX2←BX2ALADDDX,BXSIDX←DXBXSIADDAX,CL错误!操作数类型应一致ADDSI,BX错误!不允许两个操作数都是存储器ADDDS,AX错误!不允许把段寄存器作为操作数加法指令对全部6个状态标志位都会产生影响。【例2】试分析以下两条指令执行后的状态:MOVAL,7EHADDAL,5BH分析:我们用手工的方法来模拟以上两条指令的执行,如下0111111001011011110110011
f根据运算过程可得出各状态标志位的值:(Ci表示第i位的进位)C31,所以AF1;C70,所以CF0;C7C61,所以OF1;结果中1的个数为奇数,所以PF0;结果的bit71,所以SF1;结果不为零,所以ZF0。其中CF0意味着若操作数是无符号数,则结果没有产生溢出;而OF1意味着若操作数是有符号数,则运算结果溢出。事实上,根据运算结果ALD9H>7FH(8位有符号数的最大值)和D9H<FFH(8位无符号数的最大值)也可得到相同结果。②带进位的加法指令ADC【例3】设CF1,写出以下指令执行后的结果。MOVAL,7EHADCAL,86H指令执行后:AL7EHABH12AH,且CF1。【例4】求两个32位无符号数0107A379H与10067E4FH二者之和。MOVDX,0107H第一个数高16位传送到DXMOVAX,0A379H第一个数低16位传送到AXMOVBX,1006H第二个数高16位传送到BXMOVCX,7E4FH第二个数低16r