什么时候应该用汇编语言设置进位标志

Sum*_*Tea 8 c assembly arm

在C中编写ARM汇编模拟器时,我对此问题感到困惑.我在论坛中发现了一些类似的问题,但没有一个解释如何使用两个操作数和结果之间的关系来设置进位标志.

任何回复表示赞赏.提前致谢.

看待.

Pau*_*l R 6

进位标志以正常方式设置,例如作为产生进位的加法结果.然后,您可以使用ADC(with with carry)指令将此进位传播到高位字,例如,当进行64位加法时:

ADDS    r4, r0, r2    ; add least significant words
ADC     r5, r1, r3    ; add most significant words with carry
Run Code Online (Sandbox Code Playgroud)

在此示例中,r4:r5中的64位值等于r0:r1和r2:r3中64位值的总和.

在ARM的早期版本中,您可以明确地设置进位标志,如下所示:

ORRS R15,R15,#&20000000
Run Code Online (Sandbox Code Playgroud)

或者像这样:

TEQP R15,#&20000000
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅本教程:http://www.peter-cockerell.net/aalp/html/ch-3.html

显然,较新版本的ARM已将进位标志移至另一个寄存器(请参阅下面的注释).

  • @Skizz:实际上我认为当*是*借用时C被*清除*,当*有*借用时*设置*.与加法一样,当你需要将借位传播到更高阶的单词时,这允许使用`SBB`(借用减去). (3认同)

APr*_*mer 4

您必须检查处理器的参考手册,以了解哪些指令设置进位标志以及以何种方式设置。我对 ARM 不太了解,但我看到了其他处理器的一些变化:

  • 一些逻辑上产生进位的指令可能不会设置进位标志

  • 某些指令可以使用进位标志作为一些附加的隐式操作数或结果,而无需与加法/减法连接

  • 减法之后,处理器在设置进位标志的条件下会有所不同(即,有些处理器以与反转的第二个操作数相加后相同的方式进行操作,另一个将其设置为该操作数的负数)

如果你想要的是一种方法来查看是否应该为 C 中的加法生成进位,这里有两种方法(第一种是直接来自定义,第二种来自无符号的环绕行为):

unsigned w1, w2, result;
int carry;

carry = w1 > UINT_MAX-w2;

result = w1 + w2;
carry = result < w1;
Run Code Online (Sandbox Code Playgroud)