assembly 关于进位标志的ARM文档的混淆

e37o9pze  于 2023-10-19  发布在  其他
关注(0)|答案(3)|浏览(135)

在ARM文档here中,它说:
出现进位:
.如果减法的结果是正的或零.
我从this answer on SO知道,当有无符号下溢时,进位标志在减法中被设置(即被减去的数字(减数)大于被减去的数字(被减数))。
让我们来看看这个例子:

r1 = 5
r2 = 10
CMP r1, r2

比较(CMP)执行减法as mentioned here,然后设置适当的标志。在这种情况下,r1-r2 = 5-10 = -5。由于这里有无符号下溢(5 < 10),我们希望设置进位标志。但根据ARM文档,结果(-5)不是正数或零,因此不应设置进位标志。(假设我们看签名的结果;否则根据文档将永远不会发生进位)。
ARM的文档是错误的吗?我误会什么了?

wd2eg0qa

wd2eg0qa1#

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

7kqas0il

7kqas0il2#

我们不需要所有的32位来显示减法是怎么回事:
五比三
从小学我们知道,5 - 3 = 5 +(-3),这是它是如何在逻辑上完成,二进制补码的一个特点是得到-3你反转和添加一个,所以:
五比三

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

完成它:

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

所以一般来说(不是处理器特定的)5 - 3 = 2。MSbit的进位输入和进位输出都是1,因此带符号的溢出将不被设置,进位输出是1。但是有些架构除了反转第二个操作数和进位(到lsbit)之外,还反转进位输出,称之为借用。有些人不会。
当你看到大于和小于之类的东西时,有些文件会记录进位的定义:
5 - 4

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

五比五

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,这意味着指令集如何解释该位,但不是通过其自身。

rhfm7lfc

rhfm7lfc3#

我也有同样的困惑:

  • The ALU status flags
  • 如果加法的结果大于或等于232,如果减法的结果为正,或者作为移动或逻辑指令中的内联桶形移位器操作的结果,则发生进位

5 - 3 = 2-> positive result->应该C=1吗?
终于找到了ARM官方的有用文档:Carry flag
在A32/T32代码中,C以下列方式之一设置:

  • 对于包括比较指令CMN的加法,如果加法产生进位(即,无符号溢出),则C被设置为1,否则被设置为0。
  • 对于减法,包括比较指令CMP,如果减法产生借位(即,无符号下溢),则将C设置为0,否则设置为1。

了解:

  • 对于减法:5 - 10 = -5 -> produced a borrow = unsigned underflow = negative result ->应C=0
  • 注:C=1

因此,符合:

  • 对于减法:5 - 3 = 2-> positive result->应该C=1

相关问题