【问题标题】:Contradiction in this ARM documentation on carry flag?此 ARM 文档中关于进位标志的矛盾?
【发布时间】:2018-11-05 13:06:28
【问题描述】:

在 ARM 文档 here 中,它说:

C

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

进位发生:

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

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

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

这对于这种情况是有意义的:

CMP 3,5

这将执行3-5。由于3 < 5,发生无符号下溢并且进位标志不会在ARM 中设置。 使用 ARM 文档中的逻辑,3-5 得到 -2,这是负数,因此不会发生进位,因此不会设置进位标志。

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

========

现在考虑这种情况:

CMP -1,0

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

但是看看 ARM 文档是怎么说的:

进位发生:

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

根据上面的文档,由于-1-0 的结果为-1,这是负数,因此不会发生进位,因此不会设置进位标志。但这意味着LO 条件代码为真,这意味着当将它们都视为无符号数字时-1 低于0(就像我们同时处理它们时3 如何低于5作为前一个场景中的无符号数字)。显然这不是真的,因为0xffffffff > 0x00000000

当我尝试根据文档内容计算进位标志逻辑时,如何解释这种矛盾?

【问题讨论】:

  • 请不要使用问题中的链接剪切并粘贴相关行:0011 CC/LO Carry clear/unsigned lower
  • 进位/借位位由 msbit 的进位定义,而不是 msbit 的结果值,即 N 位。用铅笔和纸数学很容易证明这是什么,就像小学一样。显示执行更改的时间和位置(您需要尝试的唯一情况是 3 - 4、3 - 3、3 - 2,每个操作数中只需要 4 位)。

标签: assembly arm compare carryflag


【解决方案1】:

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

【讨论】:

  • 啊……当!您能否扩展您的答案以解释为什么仅当我考虑 33 位输出(最好带有示例)时引用才有意义?
  • 请看之前的评论
【解决方案2】:

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 小两点

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

无符号 C = 1 意味着

0010 CS/HS 进位设置/无符号更高或相同

这是真的 5 大于 3

如果你想让 unsigned 更高但不一样,那么你也可以看看 Z 标志

1000 HI 无符号较高 C 集和 Z 清除

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

1100 GT 签名大于

一个有符号的 5 大于一个有符号的 3 就像

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

无符号 5 大于无符号 3

3 - 5 = 0xFFFFFFFE

(进位集是一个无符号溢出顺便说一句,至少在这种情况下它有效)

【讨论】:

  • 他们的逻辑绝对没有被打破,它已经正确了几个,嗯,三个十年,可以追溯到第一批 Acorn Risc 机器芯片(在我们今天所知的 ARM 之前)。因此,除非这是针对课程或个人教育的,否则您可以按照手册中的说明运行,它是我所见过的关于条件代码的更好的手册之一,因为它向您显示了标志……其他您必须付费注意或实验以确定它们是否意味着有符号或无符号更低或更大......
猜你喜欢
  • 1970-01-01
  • 2021-09-30
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
相关资源
最近更新 更多