您的位置:首页 > 其它

ARM的 N、Z、C、V 标志位的解释

2009-09-24 16:00 567 查看
N 当用两个补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果为正数或零.

Z Z=1表示运算的结果为零,Z=0表示运算的结果非零。

C 可以有4种方法设置C的值:

加法运算(包括CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。

减法运算(包括CMP):当运算时产生了借位时(无符号数溢出),C=0,否则C=1。

对于包含移位操作的非加/减运算指令,C为移出值的最后一位。

对于其它的非加/减运算指令,C的值通常不会改变。

V 可以有2种方法设置V的值:

对于加减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出

对于其它的非加/减运算指令,V的值通常不会改变。

0000 = EQ - Z set (equal,相等)

0001 = NE - Z clear (not equal,不相等)

0010 = CS - C set (unsigned higher or same,无符号大于或等于)

0011 = CC - C clear (unsigned lower,无符号小于)

0100 = MI - N set (negative,负数)

0101 = PL - N clear (positive or zero,正数或零)

0110 = VS - V set (overflow,溢出)

0111 = VC - V clear (no overflow,未溢出)

1000 = HI - C set and Z clear (unsigned higher,无符号大于)

1001 = LS - C clear or Z set (unsigned lower or same,无符号小于或等于)

1010 = GE - N set and V set, or N clear and V clear (greater or equal,带符号大于或等于)

1011 = LT - N set and V clear, or N clear and V set (less than,带符号小于)

1100 = GT - Z clear, and either N set and V set, or N clear and V clear (greater than,带符号大于)

1101 = LE - Z set, or N set and V clear, or N clear and V set (less than or equal,带符号小于或等于)

1110 = AL - always

1111 = NV - never

对于V的解释

正数相加变成负数

1)(+72)+(+98)=?

0 1 0 0 1 0 0 0 B +72

+ 0 1 1 0 0 0 1 0 B +98

1 0 1 0 1 0 1 0 B -42

负数相加变成正数

2)(-83)+(-80)=?

1 0 1 0 1 1 0 1 B -83

+ 1 0 1 1 0 0 0 0 B -80

0 1 0 1 1 1 0 1 B +93

这两个题目,按照正常的法则来运算,但结果显然不正确,这是怎么回事呢? 答案:这是因为发生了溢出。

如果计算机的字长为n位,n位二进制数的最高位为符号位,其余n-1位为数值位,采用补码表示法时,可表示的数X的范围是 -2n-1≤X≤2n-1-1

当n=8时,可表示的有符号数的范围为-128~+127。两个有符号数进行加法运算时,如果运算结果超出可表示的有符号数的范围时,就会发生溢出,使计算结果出错。很显然,溢出只能出现在两个同符号数相加或两个异符号数相减的情况下。

对于加法运算:

1)、如果次高位(数值部分最高位)形成进位加入最高位,而最高位(符号位)相加(包括次高位的进位)却没有进位输出时;

2)、或者反过来,次高位没有进位加入最高位,但最高位却有进位输出时。

都将发生溢出。因为这两种情况是:两个正数相加,结果超出了范围,形式上变成了负数;两负数相加,结果超出了范围,形式上变成了正数。

对于减法运算:

1)、当次高位不需从最高位借位,但最高位却需借位(正数减负数,差超出范围);

2)、或者反过来,次高位需从最高位借位,但最高位不需借位(负数减正数,差超出范围)。就会出现溢出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: