【问题标题】:Confusion about ARM documentation on carry flag关于进位标志的 ARM 文档的困惑
【发布时间】:2018-10-30 13:37:40
【问题描述】:

在 ARM 文档 here 中,它说:

进位发生:

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

我从this answer on SO 知道,当存在无符号下溢(即被减去的数字(减数)大于被减去的数字(被减数))时,进位标志在减法中设置。

所以考虑这个例子:

r1 = 5
r2 = 10
CMP r1, r2

比较 (CMP) 执行减法 as mentioned here,然后设置适当的标志。在这种情况下,r1-r2 = 5-10 = -5。由于这里有无符号下溢(5

ARM 文档有错吗?我有什么误解?

【问题讨论】:

  • 无符号溢出是加法的msbit的进位。如果加法的 msbit 的进位和进位不同,则设置有符号溢出。逻辑使用加法来做减法。二进制补码否定 (-a) = -(a) 取反并加一,第二个操作数取反(取反),进位取反(一一)。一些架构反转进位以指示无符号借用而不是无符号溢出。
  • 您链接的问答是关于 x86 的,其中进位标志用作减法的借位标志。 ARM 则相反。
  • @PeterCordes 哎呀哈哈;感谢您的澄清。 (这引起了我的困惑,fuz 的回答也澄清了)

标签: assembly arm compare carryflag


【解决方案1】:

ARM 使用反向进位标志进行借位(即减法)。这就是为什么在没有借位时设置进位并在有时清除。这种设计决策使得构建 ALU 稍微简单一些,这也是一些 CPU 这样做的原因。

【讨论】:

  • 相同的文档提到当进位标志被清除时,CC 条件代码(无符号较低)为真。在问题的CMP 5,10 示例中,ARM 中不会设置进位标志。因此,在 ARM 中,我应该将 CC 视为“第二个参数是否低于第一个无符号参数”?
  • @takanuva15 我认为这是正确的。 CC 条件代码的另一个名称是 LO,表示“无符号下限”。
  • 有趣...所以对于其他汇编语言中进位标志未反转的程序,我需要将CMP 5,10 解读为“第一个参数是否低于第二个无符号参数”? (这可能一直让我感到困惑)
  • 等等,不。从我的第一条评论开始,由于CMP 5,10 没有设置进位标志,CC/LO 标志将为真。这意味着我应该将CMP 5,10(带有以下CC 检查)读作“第一个参数是否低于第二个无符号参数”?
  • 抱歉,我误读了您的第一条评论。是 CMP a, b 后跟 BCC 分支,如果 a < b 未签名。
【解决方案2】:

我们不需要所有 32 位来显示减法发生了什么

5 - 3

从小学我们知道 5 - 3 = 5 +(-3) 这就是它在逻辑上的实现方式,二进制补码的一个特点是得到 -3 你反转并添加一个所以

5 - 3

      1
   0101
 + 1100
=========

完成它

  11011
   0101
 + 1100
=========
   0010

所以一般来说(不是特定于处理器)5 - 3 = 2。误位的进位和进位都是一个,因此不会设置有符号溢出,进位是 1。但是某些架构以及反转第二个操作数和进位(到 lsbit)也反转进位,称为借位。有些没有。

当您查看诸如大于和小于之类的东西时,有些文档会说明进位位的定义是什么

5 - 4

  11111
   0101
 + 1011
=========
   0001

5 - 5

  11111
   0101
 + 1010
=========
   0000

5 - 6

  00011
   0101
 + 1001
=========
   1111

5 - 7

  00011
   0101
 + 1000
=========
   1110

这表明,如果您查看原始执行,它会在操作数 b 等于操作数 a 时切换,当 b 小于 a 时,它会在 b 等于或大于 a 时设置,这很清楚。因此,如果体系结构保持不变,您可以在大于或等于的一种情况下使用进位位来表示大于或小于(但不等于)由该标志定义,并且哪个方向取决于体系结构(如果它反转执行成借位)。在另一个方向,您要么翻转操作数并使用一位,要么使用 N 和 C 来确定大于或等于的值。

与其他一些文档不同,arm 文档会针对每个条件向您展示标志是什么,并且知道上述内容或能够在简单的测试中重复它,您可以确定它们是否反转。指令 sbb 是用借位减法,而不是 sbc 用进位减法,但它本身并不暗示该指令集如何解释该位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多