3

我正在查找一些 ARM 程序集,我注意到 EOR/XOR 和 AND 都设置了 C 和 O 标志。这是如何运作的?他们总是被清除吗?他们设定了什么条件?

4

4 回答 4

5

如果您决定继续使用 ARM 汇编程序,您需要一份 ARM ARM 副本,即 ARM 体系结构参考手册。有许多版本,每个版本都有自己的“功能”。我建议尽可能多地收集,但那是另一个故事。有多种方法可以免费获得电子版。无论哪种方式:

并且您需要设置 S 位,这对于 ARM 意味着使用 ANDS 而不是 AND。对于拇指模式,您总是使用 ANDS,但例如 gas 拒绝接受拇指模式中的 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

当涉及到标志时,EOR 与 AND 相同

于 2009-08-02T05:43:54.737 回答
4

我根本不相信正常的 AND/EOR 设置进位和溢出标志。ANDS 和 EORS 变体(AND/EOR with set)可以设置进位,但前提是右侧是移位操作数。这些都不影响溢出标志。

例如,

ANDS R0,R1,R2, LSR #1

将根据 R2 的 b0 设置进位。如果该位为 1(即 R2 为奇数),则设置进位。

请参阅此处了解详细信息(第 3 章,指令集)。

于 2009-07-29T11:12:10.290 回答
4

正如其他海报所指出的,C 标志是基于在操作之前可选地应用于源寄存器之一的移位来更新的。

V(溢出)标志不受这些指令的影响。

如果结果正好为零,则设置 Z 标志,如果当作为二进制补码整数(即高位为 1)时结果为负,则设置 N 标志。

于 2009-07-29T23:42:49.627 回答
2

回想一下,您可以在操作后任意移动结果。进位标志是根据桶形移位器的进位设置的。溢出标志永远不会受到影响。

于 2009-07-29T11:07:06.217 回答