IT指令ARM组装点

时间:2014-01-02 15:51:19

标签: assembly arm

我已获得以下ARM汇编代码。

CMP             R0, #0
ITT EQ
MOVEQ           R0, #0x7FFFFFFF
BXEQ            LR

首先,为什么MOV和BX指令后需要均衡器? ARM reference表示ITT之后的条件(EQ)将应用于IT块中的第一条指令(MOV),然后由于ITT中的第二条T,EQ将应用于第二条指令(BX) )在IT区块。因此,如果ITT正在应用EQ,为什么MOVEQ和BXEQ需要EQ?

其次,为什么需要IT指令呢?为什么不只是:

CMP             R0, #0
MOVEQ           R0, #0x7FFFFFFF
BXEQ            LR

它的MOV不是MOVS所以标志不会被更新,而BXEQ中的EQ仍将是"引用"至CMP设定的标志值。

3 个答案:

答案 0 :(得分:13)

为什么不试试呢?

.cpu cortex-m3
.thumb
.syntax unified

    CMP             R0, #0
    ITT EQ
    MOVEQ           R0, #0x7FFFFFFF
    BXEQ            LR


    CMP             R0, #0
    MOVEQ           R0, #0x7FFFFFFF
    BXEQ            LR

首先尝试

arm-none-eabi-as vectors.s -o vectors.o
vectors.s: Assembler messages:
vectors.s:13: Error: thumb conditional instruction should be in IT block -- `moveq R0,#0x7FFFFFFF'
vectors.s:14: Error: thumb conditional instruction should be in IT block -- `bxeq LR'
make: *** [vectors.o] Error 1

这是显而易见的,因为在拇指模式下没有这些指令的条件版本。

所以离开:

.cpu cortex-m3
.thumb
.syntax unified

    CMP             R0, #0
    ITT EQ
    MOVEQ           R0, #0x7FFFFFFF
    BXEQ            LR

工具很满意

   0:   2800        cmp r0, #0
   2:   bf04        itt eq
   4:   f06f 4000   mvneq.w r0, #2147483648 ; 0x80000000
   8:   4770        bxeq    lr

所以我们尝试没有eq

.cpu cortex-m3
.thumb
.syntax unified

    CMP             R0, #0
    ITT EQ
    MOV           R0, #0x7FFFFFFF
    BX            LR

不开心

vectors.s:8: Error: instruction not allowed in IT block -- `mov R0,#0x7FFFFFFF'
vectors.s:9: Error: incorrect condition in IT block -- `bx LR'

我认为它必须只是一种语法来帮助你,并确保你得到你真正想要的东西。

.cpu cortex-m3
.thumb
.syntax unified

    CMP             R0, #0
    IT EQ
    MOVEQ           R0, #0x7FFFFFFF
    BX            LR

给出

   0:   2800        cmp r0, #0
   2:   bf08        it  eq
   4:   f06f 4000   mvneq.w r0, #2147483648 ; 0x80000000
   8:   4770        bx  lr

注意bx lr是相同的指令0x4770,结尾处的eq或者结尾处的eq似乎清楚地作为汇编语法来帮助你并确保你获得与If Then相关的正确数量的指令指令。 (你可以看到在一个条件指令和两个条件指令之间发生了变化)。

我觉得很麻烦

.cpu cortex-m3
.thumb
.syntax unified

    CMP             R0, #0
    IT EQ
    MOVSEQ           R0, #0x7
    BX            LR

    movs r0,#7
    mov r0,#7
    movs.w r0,#7

在这种情况下,使用了thumb2扩展

00000000 <.text>:
   0:   2800        cmp r0, #0
   2:   bf08        it  eq
   4:   f05f 0007   movseq.w    r0, #7
   8:   4770        bx  lr
   a:   2007        movs    r0, #7
   c:   f04f 0007   mov.w   r0, #7
  10:   f05f 0007   movs.w  r0, #7

这是一种好奇心。

从指令集文档中可以明显看出它的原因。完整的臂指令在每条指令上都有一个4位的条件字段。拇指说明没有。起初你只是在条件上做了传统分支以避免指令,拇指没有提供每条指令的ARM特性是有条件的而不需要冲洗管道。因此,根据文档,他们使用ARMv7-M添加了If Then(IT)指令,并且正如这些文档中所述,这允许您在if之后使用最多四条指令成为条件。我相信上面的语法游戏(没有证据,除了它似乎是这样)是有助于人为错误。

现在,如果不是在拇指模式下,那么你绝对可以将条件应用于指令

.syntax unified

    CMP             R0, #0
    MOVSEQ           R0, #0x7
    BXEQ            LR

    movs r0,#7
    mov r0,#7

给出

00000000 <.text>:
   0:   e3500000    cmp r0, #0
   4:   03b00007    movseq  r0, #7
   8:   012fff1e    bxeq    lr
   c:   e3b00007    movs    r0, #7
  10:   e3a00007    mov r0, #7

也许这是你问题的根源,但是汇编程序很可能只是为你插入IT指令,但是汇编语言有一对一的愿望(尽管所有的伪指令都是在那里的处理器)所以我猜他们希望你明确地表明你想要If Then指令那里和/或你将在那里有一个If Then指令。汇编程序也在帮助您说您需要使用IT块而不是简单地说它是无效的指令。

进一步的实验

.cpu arm7t
.thumb
.syntax unified

    CMP             R0, #0
    MOVSEQ           R0, #0x7
    BX            LR

    movs r0,#7

令人烦恼,因为如果你把IT留在那里它就知道这是错误的:

vectors.s:7: Error: selected processor does not support Thumb mode `it EQ'

然后在同一口气中说

vectors.s:7: Error: thumb conditional instruction should be in IT block -- `movseq R0,#0x7'

答案 1 :(得分:9)

ARM体系结构参考的ARMv7-A和ARMv7-M版本(A4.2.1“条件指令”)说:

  

虽然其他Thumb指令是无条件的,但所有指令都是如此   由IT指令制定的条件必须用   条件。这些条件必须符合条件规定的条件   IT指导。例如,ITTEE EQ指令强制执行EQ   前两条指令的条件和NE   在接下来的两个条件。必须写下这四条指令   分别具有EQ,EQ,NE和NE条件。

我同意dwelch,它可能以这种方式指定以帮助减少编程错误,因为条件代码未在机器操作码中编码。

此外,出于“统一汇编语言”的目的(其中相同的汇编助记符可用于32位ARM或Thumb模式),相反的操作在ARM模式下完成。即使没有为IT指令生成机器操作码,也会检查IT指令是否与后面的条件指令保持一致:

  

为了在ARM和Thumb指令集之间实现UAL汇编语言的最大可移植性,ARM建议:

     
      
  • IT指令是在条件指令之前以Thumb指令集的正确方式编写的。

  •   
  • 汇编到ARM指令集时,汇编程序会检查所有IT指令是否正确,但不为它们生成任何代码。

  •   

答案 2 :(得分:2)

您需要在拇指模式下执行IT指令,否则条件位在指令中不可用。你的第一个例子很可能是拇指代码,而不是ARM模式。

  

为什么MOVEQ和BXEQ需要均衡器?

您可以在IT块中使用反向条件。我认为用这种方式阅读起来也更容易。