为什么以下编译:
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
但这不是:
ITT NE
MRSNE R0, PSP
MRSEQ R0, MSP
是否有可能MRSNE R0,PSP和MRSEQ R0,MSP都执行(这是我的情况)?
This compiles:
ITT NE
MRSNE R0, PSP
MRSNE R0, MSP
是ARM标准吗?
答案 0 :(得分:10)
但这不是:
ITT NE MRSNE R0, PSP MRSEQ R0, MSP
首先你有一些概念问题。什么是ITT
全部?首先是一些历史。早期的ARM CPU不支持 Thumb (16位),也不支持 Thumb2 (混合16/32位)编码。对于纯ARM,大部分(4个前导位)专用于条件执行。 Thumb 指令集不支持条件执行。对于 Thumb2 (您在Cortex-M部件上想要的内容),有条件执行的变体。有一条it
指令在条件寄存器中设置了8位,而不是在每条指令中编译条件。
it
指令与测试(EQ
,NE
,LO
等进行比较。然后它最多提供四个条件指令。从Cortex-A程序员手册
第A.1.34节
IT (If-then)在条件指令(称为IT
块)之后补充四。条件可以全部相同,或者某些条件可以是其他条件的逻辑反转。 IT
是ARM状态下的伪指令。
语法:IT{x{y{z}}} {cond}
其中: cond 是条件代码。请参见第6.1.2节,其中指定了IT块中第一个指令的条件
x , y 和 z 指定IT
块中第二,第三和第四条指令的条件开关,例如, ITTET
。
条件开关可以是:
为了同时支持 Thumb2 和 ARM 汇编程序,创建了一个名为unified assembler language的新模式。 Ref:Unified Syntax < / SUP>
对于纯ARM,IT
评估为空。指令使用条件进行编码。对于Thumb2,它会使条件寄存器置位以设置条件位。 ARM汇编程序有三种模式; .arm
,.thumb
和.unified
。还有.code 32
和.code 16
。根据使用的模式和特定的汇编程序(Gnu,ARM等),您将收到不同的警告和/或错误。但是,对于您的序列,此模式永不失败
ITE NE ; first NE, 2nd !NE = EQ (Thumb2)
MRSNE R0, PSP ; first NE (ARM)
MRSEQ R0, MSP ; 2nd !NE = EQ (ARM)
MRS
指令是“IT块”。在您的情况下,您使用 thumb2 特殊寄存器,因此统一语法对于手头的任务没有多大意义。见下面的注释。
要制作统一的IT
块,您应该注意一些规则。
IT
块不应设置条件代码。即,cmpne
指示。IT
区块。IT
开头,因此IT
中的 cond 必须与第一条指令匹配。PSR
,cpsr
等。参见注释
movlo r1, #-1
moveq r1, #0
movhi r1, #1
可以在ARM中工作,但不能在 Thumb2 中工作。在您的情况下,您违反了规则'4'并收到错误。
示例:
.text
.syntax unified
ITE NE @ first NE, 2nd !NE = EQ (Thumb2)
movne R0, #1 @ first NE (ARM)
moveq R0, #2 @ 2nd !NE = EQ (ARM)
反汇编 ARM ,
00000000 <.text>:
0: 13a00001 movne r0, #1
4: 03a00002 moveq r0, #2
反汇编 thumb2 ,
00000000 <.text>:
0: bf14 ite ne
2: 2001 movne r0, #1
4: 2002 moveq r0, #2
对于 thumb2 ,这是没有ITE
指令的等价物,
00000000 <.text>:
0: 2001 movs r0, #1
2: 2002 movs r0, #2
即,设置条件代码的两个动作。汇编程序中的第二个数字当然是机器代码。对于 thumb2 OS / scheduler,它将恢复恢复IT
状态的条件寄存器,您可以输入到IT
的中间位置块。也可以手动执行此操作(但是,它可能具有高度CPU特定性,并且没有我所知道的文档)。
注意:对于改变PSR
的 Cortex-M 调度程序代码,您需要使用分支。这些寄存器控制IT
块执行。您不应修改PSR
块中的IT
。这同样适用于任何上下文恢复指令;我不是100%熟悉Cortex-M模式切换,它涉及更改活动PSR
。