我正在查找一些 ARM 程序集,我注意到 EOR/XOR 和 AND 都设置了 C 和 O 标志。这是如何运作的?他们总是被清除吗?他们设定了什么条件?
我不相信正常的 AND/EOR 根本不会设置进位和溢出标志。ANDS 和 EORS 变体(带设置的 AND/EOR)可以设置进位,但前提是右侧是移位操作数。这些都不会影响溢出标志。
例如,
ANDS R0,R1,R2, LSR #1
Run Code Online (Sandbox Code Playgroud)
将根据 R2 的 b0 设置进位。如果该位为 1(即 R2 为奇数),则进位将被设置。
请参阅此处了解详细信息(第 3 章,指令集)。
如果您决定继续使用 ARM 汇编程序,您需要一份 ARM ARM,即 ARM 体系结构参考手册。有许多版本,每个版本都有自己的“功能”。我建议尽可能多地收集,但那是另一回事了。有多种方法可以免费获得电子副本。无论哪种方式:
AND 您需要设置 S 位,这对于 ARM 意味着使用 ANDS 而不是 AND。对于拇指模式,您总是使用 ANDS,但气体例如拒绝接受拇指模式下的 ANDS(但总是将其分解为 ands)。
If S==1 and Rd == R15 then
CPSR=SPSR
else if S==1
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = shifter_carry_out
V flag = unaffected
Run Code Online (Sandbox Code Playgroud)
EOR 与 AND 在标志方面相同