arm处理器的CarryFrom操作



Arm架构手册中说,如果设置了s标志并且进位"发生",则ADC指令将在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

然后我们使用进位进行加法运算,并使用前一个加法的进位作为第二个(或下一个)的进位(因为您可以为尽可能多的代码/内存空间执行此操作)

1
0000
+ 0000
======
00001
0000
+ 0000
======
0001

,最终结果是0x10。0x0F + 0x01 = 0x10

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

相关内容

  • 没有找到相关文章

最新更新