本ARM文档中关于进位标志的矛盾?

时间:2018-11-04 20:23:18

标签: assembly arm compare carryflag

在ARM文档here中,它表示:

  

C

     

当该操作导致进位时设置为1,否则清除为0。

  

发生进位:

     

...如果减法的结果是正数或零...

(很显然,结果必须被视为带符号的数字;否则,总会出现减法的进位)。

我知道进位标志在ARM中是“反转”的。因此,如果减法需要借位,那么即使在逻辑上确实发生了“进位”(即未签名的下溢),也不会设置进位标志。

在这种情况下这很有意义:

CMP 3,5

这将完成3-5。自3 < 5起,将发生无符号下溢,并且不会在ARM中设置进位标志。 使用ARM文档中的逻辑,3-5得出-2,它为负,因此不会发生进位,因此未设置进位标志。

现在,根据上面链接的ARM文档,ARM中的LO(又名CC)条件代码表示“无符号的,较低的”比较,当{在ARM中未设置进位标志(即true)。因此,对于上面的示例,C == 0条件代码为true。这也很有意义,因为将3和5都视为无符号数字时,它们要小于5。

========

现在考虑这种情况:

LO

这将执行CMP -1,0,即-1-0。从0xffffffff - 0x00000000开始,从逻辑上讲,不会发生无符号下溢,并且会设置进位标志。

但是请看一下ARM文档中的内容:

  

发生进位:

     

...如果减法的结果是正数或零...

根据上述文档,由于0xffffffff > 0x00000000的结果为-1-0(它为负数),因此不会发生进位,因此未设置进位标志。但这意味着-1条件代码为true,这意味着当将LO都视为无符号数字时,-1会比0更低(就像3低于5(在上一场景中将它们都视为无符号数字时)。显然,自0xffffffff > 0x00000000起,情况并非如此。

当我试图根据文档中的内容计算进位标记逻辑时,如何解释这一矛盾?

2 个答案:

答案 0 :(得分:2)

仅当输入值与完整(33位)输出一起被视为无符号时,您的报价才有意义。请注意,随附的描述指的是大于2 ^ 32的输出。

答案 1 :(得分:0)

CC / LO的UNSIGNED较低而不是SIGNED较低。没有-1个无符号数,它是2 ^ 32-1、2 ^ 32-1-0 = 2 ^ 32-1和0绝对小于2 ^ 32-1。

现在,如果您想将-1与0进行比较,则这是一个带符号的比较,然后返回该表并查看与带符号的结果相关的标志。

两个数字一个比另一个大,因为写的清楚地想将它们解释为带符号的数学。

-3--4 = -3 + 4

 11000
  1101
+ 0100
=======
  0001

N = 0 V = 0

如果N == V,则用更大或相同的单数表示,是的-3大于-4

  

1100 GT的符号大于N == V

-1-0 = -1 +(-0)= -1 + 0

 0000 
  111
 +000
=====
  111

N = 1 V = 0

或者如果-1 +(-0)

  1111
   111
 + 111
=======
   111

N = 1,V = 0

  

1011 LT的签名小于N!= V

这是真的-1小于零。

还有顺便说一句

3-5

 00111
  0011
 +1010
=======
  1110

无符号3-无符号5是一个非常大的数字0xFFFFFFFE,比2 ^ 32小2

C = 1,N = 1,V = 0,Z = 0

无符号C = 1表示

  

0010 CS / HS进行置位/未签名较高或相同

这是真的5大于3

如果您想让无符号数更高但不相同,那么您也可以查看Z标志

  

1000 HI无符号高C置位和Z清零

现在您正试图说3-5 = -2,这显然是带符号数学而不是带符号数学。所以V == Z

  

1100 GT签名大于

签名5大于签名3就像

  

0010 CS / HS进行置位/无符号更高或相同的C集

无符号5大于无符号3

3-5-0xFFFFFFFE

(进位设置是无符号溢出BTW,至少在这种情况下有效)