assembly - IT指令点ARM汇编

标签 assembly arm

我有以下 ARM 汇编代码。

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

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

其次,为什么需要 IT 指导?为什么不只是有:
CMP             R0, #0
MOVEQ           R0, #0x7FFFFFFF
BXEQ            LR

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

最佳答案

你为什么不试试呢?

.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

那是一种好奇心。

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

现在,如果不在拇指模式下,那么您绝对可以将条件应用于指令
.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 block 而不是简单地说它是无效指令来帮助您。

进一步的实验
.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'

关于assembly - IT指令点ARM汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20886563/

相关文章:

assembly - x86 中是否允许访问跨越零边界的内存?

c - ICC 是否满足复数乘法的 C99 规范?

c - GCC 忽略 `-mcpu=arm7tdmi` 标志并生成不支持的指令

linux-kernel - SMP计划在Linux内核中如何工作? (ARM体系结构)

qt - 如何在 QtCreator 上配置交叉编译工具链?

android - arm_neon.h 是否缺少所有 float16_t 类型?

c - 使用 arm-linux-gnueabi-gcc 交叉编译 ARMv6l 的标志

c - 缓冲区溢出跳转到禁用的功能

assembly - 将非常简单的 ARM 指令转换为二进制/十六进制

c - NASM直接访问声卡(无操作系统)