【问题标题】:Binary subtraction, carry bit not set?二进制减法,进位未设置?
【发布时间】:2019-04-16 01:04:55
【问题描述】:

在处理二进制减法和 NZCV 标志位时,我遇到了一种似乎有点不直观的情况。

考虑以下值

0xF7      0b 1111 0111
0xFF      0b 1111 1111

如果这些都被认为是 8B 值,其中

0x000000F7      0b 0000 .... 0000 1111 0111
0x000000FF      0b 0000 .... 0000 1111 1111

减去后的结果是

0x FF FF FF F8    0b 1111 .... 1000

我明白这个结果是如何找到的,但我不明白为什么没有为这个操作设置进位位。

据我所知,在借用 MSB 时会设置进位位,这里不是这样吗?

【问题讨论】:

  • 减 0xff 与加 0x1 相同。并且添加 0x1 不应为您的示例设置进位位。顺便说一句,您的问题是关于哪个 CPU 架构? ARM?
  • ARM M0+,这是 2 的补码吗?
  • 在 ARM 上,进位位被反转以进行减法运算。因此,如果没有发生借位,则设置进位,反之亦然。

标签: assembly binary flags


【解决方案1】:

带有进位(SBC,RSC)的ARM减法指令将进位标志(C)解释为:

0:表示借用

1:表示不借用

因此,在您的计算中,MSB 是借用的,并且进位未设置!

【讨论】:

  • 是的,这与 x86 的 CF 的工作方式相反。在 x86 上,它按照 OP 的想法工作,一个非反转借用标志。
猜你喜欢
  • 2016-10-31
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2018-05-26
  • 1970-01-01
相关资源
最近更新 更多