这里以ADD指令为例。
例子:
(A)=85H, R=20H, (20H)=0AFH,执行下述指令。ADD A,@R
其中85H=10000101B,0AFH=10101111H
相加后结果是00110100B.
现在对结果分析:
如果将其看成无符号数相加。则(A) =85H=133d, (20H)=0AFH=175d。
现在运算结果00110100B=52d。考虑到进位,运算结果应该是52d+256d=308d,
而(A) +(20H)=308d。正确。
此时进位CY=1。
如果将其看成带符号数相加,则(A) =85H=-123d,(20H)=0AFH=-81d,
现在现在运算结果00110100B=76d
(特别要注意的85H=10000101B,这里给出的10000101B实际上是补码,通过其求出其原码。另有对于带符号数,补码的补码就是原码,具体而言最高位保持不变,其余各位取反加一)。
现在考虑到溢出位,运算结果应该是-128d-76d=-204d
而(A) +(20H)=-204d。正确。
此时溢出位OF=1.
总结CF=1,OF=1.,无论有无符号数均如此。
往往都是给出指令,然后根据结果求CF,ZF,位的置位情况。
对此很多人开始会抱怨,指令中没有指出是否带有符号位。自己无法确定溢出进位情况也就无法确定CF、OF置位状态。
首先通过上述例子说明是否区分符号位对CF,ZF位取值毫无影响。
其次机器是通过CF、 OF位来确定是否进位、溢出情况,而不是通过后者来确定前者。所以不要本末倒置。一旦确定了CF、OF位后,如果程序员认为这是无符号数运算,则只考虑CF而忽略OF。反之,如果程序员认为这是有符号数运算,则只考虑OF而忽略CF。
最后面对指令时,快速确定CF,OF,位方法是:最高有效位是否向高位有无进位。有,CF位置1,反则亦反。OF位根据操作数的符号位来确定。如两个操作数相同时,而结果符号却相反则置1,否则置0。
CF位为1可表示无符号数溢出。OF位为1可表示带符号数溢出。
(对此很好理解,无符号数——最高有效位只表示数值意义,无符号意义,所以进位,表示在有限数位范围内结果溢出,对于带符号数——如果两个正(负)数相加,结果为负(正)数,肯定是溢出了)。
指令本身不区分操作数的类型。