arm 处理器上的 CarryFrom 操作

CarryFrom operation on arm processors

Arm Architecture 手册说 ADC 指令在设置了 S-Flag 并且“发生进位”时在 CPSR 中设置 C(进位)标志。摘自本书(第 155 页):

C Flag = CarrryFrom(Rn + shifer_operand + C Flag)

根据术语表,CarryFrom 定义如下:

CarryFrom
Returns 1 if the addition specified as its parameter caused a carry (true result is bigger 
than 2^(32)−1, where the operands are treated as unsigned integers), and returns 0 in all other cases. 
This delivers further information about an addition which occurred earlier in the pseudo-code. The addition is not repeated.

现在我想知道 CarryForm 操作是否与溢出检查相同。谁能给我解释一下,我如何“模拟”CarryFrom 操作或它是如何工作的?

简单的二进制加法,x是进位运算,y是进位运算。正常加法进位是0,减法进位是1。(加法器用来做减法,二进制补码的特点之一)

 y   x
  1111 
+ 0001
======

 11110
  1111 
+ 0001
======
  0000

所以结果是 0000,进位是 1。一些架构(所有这些架构都是 x86、arm、mips、pdp11、6502,...)(是的,我知道这方面的 mips)反转进位进行减法,不反转进行加法。在这种情况下,你问的是 ADC,所以这是加法,所以它不应该被任何架构修改。

4 位或 40 位都无所谓,它们都一样。

所以如果你想添加 0x0F 和 0x01 但你只有一个 4 位加法器(再次考虑 64 位和 32 而不是 8 和 4,它们都是一样的)。

我们从低位的正常加法开始

 11110
  1111 
+ 0001
======
  0000

然后我们做一个带进位的加法,并使用前一个加法的进位作为进位到第二个(或下一个,因为你可以这样做尽可能多 code/memory space就像你一样)

     1
  0000
+ 0000
======

 00001
  0000
+ 0000
======
  0001

最终结果为0x10。 0x0F + 0x01 = 0x10

这里的第一个加法恰好有一个无符号溢出,由非零进位 out/carry 标志指示。如果你只专注于此。如果 adc 也有无符号溢出,那么整个结果都是不好的,因为它不适合位数。 (如果程序员认为这些是无符号值,如果有符号,那么您会查看 V 位是否溢出,但进位仍然从第一个 ADD 级联到 ADC,然后从每个 ADC 级联到下一个,直到您覆盖了更高级别的操作)。