为什么下面的代码可以编译?
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
...但以下不是?
ITT NE
MRSNE R0, PSP
MRSEQ R0, MSP
是否有可能
MRSNE R0, PSP
和MRSEQ R0, MSP
都被执行(这是我的情况)?
编译:
ITT NE
MRSNE R0, PSP
MRSNE R0, MSP
是ARM标准吗?
但这不是:
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)最多可包含 four 以下条件指令(称为
IT
块)。条件可以全部相同,或者某些条件可以与其他条件相反。 IT
是ARM状态下的伪指令。
语法:
IT{x{y{z}}} {cond}
IT
块中第二、第三和第四条指令的条件开关,例如ITTET
。
条件开关可以是:
为了同时支持Thumb2和ARM汇编器,创建了一种称为统一汇编语言的新模式。参考:统一语法
对于纯 ARM,
IT
的计算结果为空。 这些指令是用条件编码的。对于 Thumb2,它会启动条件寄存器以设置条件位。 ARM汇编器有3种模式; .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”并收到错误。 此外,ARM 允许将无条件指令与条件指令混合。 但一般来说,当 90-99% 的情况都是在编译代码中无条件执行时,获得这些额外的操作码位会付出很高的代价。
示例:
.text
.syntax unified
ITE NE @ first NE, 2nd !NE = EQ (Thumb2)
movne R0, #1 @ first NE (ARM)
moveq R0, #2 @ 2nd !NE = EQ (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 操作系统/调度器,它将恢复条件寄存器,从而恢复
IT
状态,并且您可以 enter 进入 IT
块的中间。 也可以手动执行此操作(但是,它可能高度特定于 CPU,并且据我所知没有记录)。
Thumb2 为 6 字节,ARM 代码为 8 字节以实现同等功能。 如果“宽”(32 位)操作码位于条件块中,Thumb2 将需要更多代码空间。
注意: 对于改变 PSR
的
Cortex-M调度程序代码,您需要使用分支。 这些寄存器控制
IT
块的执行。 您不应修改 PSR
块中的 IT
。 这同样适用于任何上下文恢复指令;我并不是 100% 熟悉 Cortex-M 模式切换,这涉及到更改活动PSR
。