ARM的条件标志具体什么时候被清除/修改?

问题描述 投票:0回答:4

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

ADDS R0,R1,R2

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

  • 我说得对吗:

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

SUB R3,R4,R5

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

  • 随后,条件标志的下一次更改,无论代码行数如何,只能发生在附加了 S 的操作的下一行中?

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

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

ANDS R0,R1,R2 

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

查看它们何时设置很简单,但我发现我正在看的讲座和书籍在准确描述它们何时可以被清除时非常模糊,所以我在这里问了一个问题以获得具体的信息。

assembly arm conditional-statements flags instruction-set
4个回答
4
投票

通常是的,只有带有

S
后缀的指令才会更改标志。但是,该规则有一些例外:

    即使助记符不包含
  • TST

    TEQ
    /
    CMP
    CMN
    /
    S
    指令也会更新标志。

  • 在原始 Thumb 语法(UAL 之前)中,省略了

    S
    后缀,但大多数 ALU 指令did 更改了标志。在 UAL 中,对于 ARM 和 Thumb 指令,
    S
    后缀必须是明确的。

  • 有些指令可以直接对

    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
    (以及标志)。


2
投票

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

条件标志似乎永远不会在一段时间后真正“自动”重置。它们只能通过能够执行此操作的指令进行更新。这是我的理解:

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

  • 紧随更新标志的指令之后

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


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.

“指令未改变”含糊不清是什么?


0
投票

我知道这是一个非常古老的问题,但这里有一个非常古老的总结,可能会帮助那些像我一样找到它的人。

逻辑和算术运算的 PSR 标志更改方式有所不同:

逻辑运算(AND、BIC、EOR、MOV、MVN、ORR、TEQ、TST)

The V flag in the PSR will be unaffected.
The C flag will be set to the last bit shifted out by the barrel shifter, or is unchanged if no shifting took place.
The Z flag will be set if and only if the result is all zeroes.
The N flag will be set to the logical value of bit 31 of the result. 

算术运算(ADC、ADD、CMP、CMN、RSB、RSC、SBC、SUB)

The V flag in the PSR will be set if signed overflow occurs (i.e. if you regard the operands as signed 32 bit integers, the signed result does not fit in a 32 bit integer); this may be ignored if the operands were considered unsigned, but warns of a possible error if the operands were 2's complement signed (the destination register is set to the bottom 32 bits of the correct unsigned result).
The C flag will be set to the carry out of bit 31 of the ALU, which for addition indicates that 32 bit overflow occurred, and for subtraction indicates that 32 bit underflow did not occur.
The Z flag will be set if and only if the result was zero.
The N flag will be set to the value of bit 31 of the result, indicating a negative result if the operands are considered to be 2's complement signed.

http://www.riscos.com/support/developers/asm/instrset.html#62074

© www.soinside.com 2019 - 2024. All rights reserved.