首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IT指令臂组装点

IT指令臂组装点
EN

Stack Overflow用户
提问于 2014-01-02 23:51:19
回答 3查看 11.7K关注 0票数 13

我有下面的ARM汇编代码。

代码语言:javascript
复制
CMP             R0, #0
ITT EQ
MOVEQ           R0, #0x7FFFFFFF
BXEQ            LR

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

第二,为甚麽要有资讯科技教学呢?为什么不直接拥有:

代码语言:javascript
复制
CMP             R0, #0
MOVEQ           R0, #0x7FFFFFFF
BXEQ            LR

它是MOV,而不是MOV,因此标志不会更新,BXEQ中的EQ仍将“引用”由CMP设置的标志值。

EN

回答 3

Stack Overflow用户

发布于 2014-01-03 02:54:24

你为什么不试一下呢?

代码语言:javascript
复制
.cpu cortex-m3
.thumb
.syntax unified

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


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

第一次尝试

代码语言:javascript
复制
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

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

所以剩下的就是:

代码语言:javascript
复制
.cpu cortex-m3
.thumb
.syntax unified

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

这些工具对此很满意

代码语言:javascript
复制
   0:   2800        cmp r0, #0
   2:   bf04        itt eq
   4:   f06f 4000   mvneq.w r0, #2147483648 ; 0x80000000
   8:   4770        bxeq    lr

所以我们试着不使用eq

代码语言:javascript
复制
.cpu cortex-m3
.thumb
.syntax unified

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

不快乐

代码语言:javascript
复制
vectors.s:8: Error: instruction not allowed in IT block -- `mov R0,#0x7FFFFFFF'
vectors.s:9: Error: incorrect condition in IT block -- `bx LR'

我认为这只是一个语法问题来帮助你,并确保你得到你真正想要的东西。

代码语言:javascript
复制
.cpu cortex-m3
.thumb
.syntax unified

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

给出

代码语言:javascript
复制
   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在末尾或不在末尾看起来显然是汇编语法的东西,以帮助你,并确保你得到正确数量的指令绑定到If Then指令。(您可以看到,在具有一个条件指令和两个条件指令之间确实发生了变化)。

我确实觉得这很烦人

代码语言:javascript
复制
.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扩展

代码语言:javascript
复制
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

这是一种好奇心。

从指令集文档中可以明显看出需要它的原因。完全扩展的arm指令在每个指令上都有一个4位的条件字段。thumb指令不需要。一开始,你只是简单地做了传统的条件分支来避免指令,thumb没有提供每条指令都是有条件的ARM功能,也不需要刷新管道。因此,根据文档,他们使用ARMv7-M添加了If Then (IT)指令,并且如那些文档中所述,这允许您在if then之后最多生成四条指令,以成为条件指令。我认为上面的语法游戏(除了看起来是这样之外,没有其他证据)是为了帮助解决人为错误。

现在,如果不是在thumb模式下,那么您完全可以将条件应用于指令

代码语言:javascript
复制
.syntax unified

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

    movs r0,#7
    mov r0,#7

给出

代码语言:javascript
复制
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块,而不是简单地说它是一个无效的指令。

进一步的实验

代码语言:javascript
复制
.cpu arm7t
.thumb
.syntax unified

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

    movs r0,#7

这很麻烦,因为如果你把IT留在那里,它就会知道这是错的:

代码语言:javascript
复制
vectors.s:7: Error: selected processor does not support Thumb mode `it EQ'

但同时它又说

代码语言:javascript
复制
vectors.s:7: Error: thumb conditional instruction should be in IT block -- `movseq R0,#0x7'
票数 14
EN

Stack Overflow用户

发布于 2014-01-03 16:24:32

ARM架构参考(A4.2.1“条件说明)的ARMv7-A和ARMv7-M版本说明如下:

虽然其他Thumb指令是无条件的,但IT指令使其具有条件的所有指令都必须写入一个条件。这些条件必须与IT说明书规定的条件相匹配。例如,EQ指令将EQ条件施加在前两个后续指令上,并将NE条件施加在下两个指令上。这四条指令必须分别使用EQ、EQ、NE和NE条件编写。

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

此外,对于“统一汇编语言”(32位ARM或Thumb模式都可以使用相同的汇编助记符)而言,在ARM模式中则相反。即使没有为IT指令生成机器操作码,也会检查IT指令与后面的条件指令的一致性:

为了最大限度地提高ARM和Thumb指令集之间的汇编语言的可移植性,ARM建议:

对于Thumb指令集,

  • IT指令以正确的方式写在条件指令之前。
  • 汇编到ARM指令集时,汇编器会检查任何IT指令是否正确,但不会为它们生成任何代码。
票数 10
EN

Stack Overflow用户

发布于 2014-01-03 00:49:42

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

为什么MOVEQ和BXEQ需要EQ?

您可以在IT块中使用相反的条件。我认为这样读起来也更容易。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20886563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档