现在的位置: 首页 > 技术文章 > 正文

指令如何区分有符号数和无符号数的理解

2013年12月29日 技术文章 ⁄ 共 997字 ⁄ 字号 指令如何区分有符号数和无符号数的理解已关闭评论 ⁄ 阅读 3,028 次
数据

数据

这里以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可表示带符号数溢出。

(对此很好理解,无符号数——最高有效位只表示数值意义,无符号意义,所以进位,表示在有限数位范围内结果溢出,对于带符号数——如果两个正(负)数相加,结果为负(正)数,肯定是溢出了)。

指令本身不区分操作数的类型。

×