1

我知道要设置它们,我们需要附加S,例如

ADDS R0,R1,R2

例如,如果结果溢出,则设置 C。

  • 我说得对吗:

上一行之后的另一行代码,例如:

SUB R3,R4,R5

不会对条件标志进行任何更改?(由于缺少S

  • 随后,条件标志的下一个变化,不管代码的#lines 只能发生在下一行,并且附加了 S 的操作?

  • 此外,条件标志位的先前状态不会影响条件标志的设置方式,因为它们将完全取决于当前操作的结果被清除或设置。

如果当前操作的结果不影响某些条件位怎么办?例如

ANDS R0,R1,R2 

只有N,Z标志与它们相关,因为结果不能生成进位C或有符号溢出Z。在这种情况下,C、Z标志会被保留还是清除?

看它们什么时候被设置很简单,但是我发现我正在看的讲座和书籍在准确描述它们何时可以被清除时非常模糊,所以我在这里问了一个问题来得到一些具体的东西。

4

3 回答 3

4

通常是的,只有带有S后缀的指令会改变标志。但是,该规则有一些例外情况:

  • TST/TEQCMP/CMN指令更新标志,即使助记符不包括S.

  • 在原始 Thumb 语法(pre-UAL)中,S后缀被省略,但大多数 ALU 指令确实更改了标志。在 UAL 中,S对于 ARM 和 Thumb 指令,后缀必须是明确的。

  • 有些指令可以直接对APSR/CPSR寄存器进行操作,例如:

    MSR APSR_nzcvq, #0x80000000 ; set N flag, clear others

    VMRS APSR_nzcv, FPSCR ; load floating-point status word into ARM flags

    (MRC 也可以,但不推荐使用除 VFP/NEON 之外的协处理器)

  • 异常返回 ( RFE,LDM或) 可以在它们返回的位置SUBS PC, LR更改(以及因此标志)。CPSR

于 2013-06-13T11:11:53.243 回答
2

这应该回答您的问题: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/ Cihbjcag.html

似乎条件标志在一定时间后从未真正“自动”重置。它们只能通过能够这样做的指令进行更新。这是我的理解:

“在 ARM 状态下,以及在带有 Thumb-2 的处理器上的 Thumb 状态下,您可以根据在另一条指令中设置的 ALU 状态标志有条件地执行一条指令,或者:

  • 在更新标志的指令之后立即

  • 在任何数量的未更新标志的干预指令之后。”

于 2015-11-07T14:01:41.177 回答
1

请阅读 ARM 手册。

这怎么模糊?

if S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = shifter_carry_out
V Flag = unaffected

每个标志都明确定义。不受影响的意思是不受影响,它不被触及之前存在的任何东西都会在之后存在。其余由 ANDS 修改

同样地:

If S is omitted, the S bit is set to 0 and the CPSR is not changed by the instruction.

“没有被指令改变”有什么模糊之处?

于 2013-06-13T03:24:45.300 回答