【问题标题】:CarryFrom operation on arm processorsARM处理器上的CarryFrom操作
【发布时间】:2021-10-24 15:56:29
【问题描述】:

如果设置了 S-Flag 并且进位“发生”,则 Arm 架构手册中提到 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 操作或它是如何工作的?

【问题讨论】:

  • stackoverflow.com/questions/6265896/… 可能会有所帮助。进位标志检测 unsigned 溢出。但是“溢出”这个词本身,正如在V标志的定义中,通常指的是有符号溢出。
  • 哦,好的,谢谢你的链接!
  • 能否请您使用您的链接创建一个答案,以便我可以将此问题标记为已回答?

标签: arm


【解决方案1】:

简单的二进制加法,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 级联到下一个,直到覆盖了更高级别的操作)。

【讨论】:

    猜你喜欢
    • 2017-01-25
    • 2012-02-03
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多