ARM IT条件指令汇编程序(armcc)

时间:2014-09-23 09:25:57

标签: assembly arm conditional-statements

为什么以下编译:

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

1 个答案:

答案 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指令与测试(EQNELO等进行比较。然后它最多提供四个条件指令。从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。 条件开关可以是:

  • T(Then),它将条件cond应用于指令。
  • E(Else),它将cond的逆条件应用于指令。

为了同时支持 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块,您应该注意一些规则。

  1. IT块不应设置条件代码。即,cmpne指示。
  2. 您不应该分支到IT区块。
  3. 我们始终以IT开头,因此IT中的 cond 必须与第一条指令匹配。
  4. 以下说明必须与 cond 匹配,如果是'T'或!cond ,如果是'E'。
  5. 您不应更改条件寄存器PSRcpsr等。参见注释
  6. 您只能混合相反的类型。例如,
  7. 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