但这并不:
ITT NE
MRSNE R0, PSP
MRSEQ R0, MSP
首先,你有一些概念问题。什么是ITT
?首先是一些历史。早期的ARM CPU不支持Thumb(16bit),也不支持Thumb2(混合16/32位)编码。对于纯ARM,大部分(4个前导位)专用于条件执行。 Thumb指令集不支持条件执行。对于Thumb2(您在Cortex-M部件上需要的),在条件执行上存在变化。指令中不会编译每条指令的条件,而是在条件寄存器中设置8位的指令。
it
指令给出了一个测试比较(EQ
,NE
,LO
等)。然后它放弃四个条件指示。从皮质-A程序员手册,
第A.1.34
IT(IF-THEN)使得多达以下说明的条件(称为IT
块)。条件可以全部相同,或者有些可以是其他条件的逻辑逆。 IT
是ARM状态下的伪指令。
语法:IT{x{y{z}}} {cond}
其中:COND是一个条件码。请参见第6.1.2节,它指定了IT块中第一条指令的条件。
X,ÿ和ž指定在IT
块中的第二,第三和第四指令的条件开关,例如,ITTET
。 条件开关可以是:
- T(Then),它将条件cond应用于指令。
- E(Else),它将cond的逆条件应用于指令。
为了支持的Thumb2和ARM汇编,创建了一个名为unified assembler language新模式。 Ref:Unified Syntax
对于纯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
中的条件必须与第一条指令相匹配。
- 如果'T'或!cond如果'E',则以下指令必须匹配条件。
- 你不应该改变状态寄存器
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
块的执行。您不应修改IT
区块中的PSR
。这同样适用于任何上下文恢复指令;我不是100%熟悉Cortex-M模式切换,其中涉及更改活动PSR
。
难道它不是“ITE NE”而不是“ITT NE”吗? http://stackoverflow.com/a/7050840/1163019 – auselen 2014-09-23 09:51:56
您是否希望代码的行为完全不同取决于您传递给汇编器的选项?也许重新阅读IT的文档 - 统一的语言明确地强化了ARM(各个指令)的条件与Thumb(IT语法)的条件之间的一致性,以防止这种疯狂。 – Notlikethat 2014-09-23 11:22:37