【发布时间】: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