我了解要设置它们,我们需要附加 S ,例如
ADDS R0,R1,R2
例如,如果结果溢出则设置C.
上一行之后的另一行代码,例如:
SUB R3,R4,R5
对条件标志不做任何改变? (由于缺乏 S )
随后,条件标志的下一次更改,无论代码的#行是否只能在附加了S的操作的下一行中发生?
此外,条件标志的先前状态位对条件标志的设置方式无效,因为它们将被清除或设置完全取决于当前操作的结果。
如果当前操作的结果不影响某些条件位怎么办?例如
ANDS R0,R1,R2
只有 N,Z 标志与之相关,因为结果无法生成进位 C 或有符号溢出 Z 。在这种情况下,是否会保留或清除 C,Z 标志?
要知道它们的确定时间是直截了当的,但我发现我所看到的讲座和书籍在描述它们何时能够被清除时非常模糊,所以我在这里问了一个具体的问题。
答案 0 :(得分:2)
这应该回答您的问题:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cihbjcag.html。
似乎条件标志在一定时间后从未真正“自动”重置。它们只能通过能够执行此操作的说明进行更新。这是我的理解:
“在ARM状态下,在Thumb-2处理器的Thumb状态下,您可以根据另一条指令中设置的ALU状态标志有条件地执行指令:
在更新标志的指令后立即
在没有更新标志的任意数量的干预指令之后。“
答案 1 :(得分:1)
通常是的,只有带有S
后缀的指令才会更改标志。但是,该规则有一些例外:
TST
/ TEQ
和CMP
/ 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
(以及标志)。< / p>
答案 2 :(得分:0)
请阅读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.
关于“未被指示改变”的含义是什么?