2014-09-23 446 views
1

为什么下面编译:ARM IT条件指令汇编器(armcc)


    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标准?

+2

难道它不是“ITE NE”而不是“ITT NE”吗? http://stackoverflow.com/a/7050840/1163019 – auselen 2014-09-23 09:51:56

+0

您是否希望代码的行为完全不同取决于您传递给汇编器的选项?也许重新阅读IT的文档 - 统一的语言明确地强化了ARM(各个指令)的条件与Thumb(IT语法)的条件之间的一致性,以防止这种疯狂。 – Notlikethat 2014-09-23 11:22:37

回答

7

但这并不:

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的逆条件应用于指令。

为了支持的Thumb2ARM汇编,创建了一个名为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块。

  1. IT块不应该设置条件代码。即,cmpne说明。
  2. 您不应分支到IT区块。
  3. 我们总是从IT开始,因此IT中的条件必须与第一条指令相匹配。
  4. 如果'T'或!cond如果'E',则以下指令必须匹配条件
  5. 你不应该改变状态寄存器PSRcpsr见注
  6. 只能混合类型相反。例如,

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

+0

请参阅:[Cortex-A程序员指南](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0013d/index.html)。 – 2014-09-23 20:12:36

+0

这个PC日志证明这两个指令是否都被执行?:TST.W r14,#0x00000004, ITE NE, MRS.W r0,PSP, MRS.W r0,MSP, – 2014-09-24 11:35:43