ARM 汇编程序将 Thumb 指令转换为 Thumb2

ARM assembler transfers Thumb instructions into Thumb2

每当我编译以下程序时:

.syntax unified
.section .text
_start:
ADD R0, R1

我得到以下二进制输出:

ADD.W R0, R0, R1

这意味着我的汇编程序将 16 位代码转换为 32 位代码。 我想知道为什么我的汇编程序会这样而不是将代码编译为 16 位指令“08 44”

I 运行 使用以下命令组装:

arm-none-eabi-as -o output.o -m thumb -EL input.s

add r0,r1
adds r0,r1
adds r8,r0

arm-none-eabi-as -mthumb  so.s -o so.o
so.s: Assembler messages:
so.s:2: Error: instruction not supported in Thumb16 mode -- `adds r0,r1'
so.s:3: Error: instruction not supported in Thumb16 mode -- `adds r8,r0'

有趣

add r0,r1
add r0,r1
add r8,r1

00000000 <.text>:
   0:   1840        adds    r0, r0, r1
   2:   1840        adds    r0, r0, r1
   4:   4488        add r8, r1

有趣。

.thumb
.syntax unified

add r0,r1
add r0,r1
add r8,r1

00000000 <.text>:
   0:   eb00 0001   add.w   r0, r0, r1
   4:   eb00 0001   add.w   r0, r0, r1
   8:   4488        add r8, r1

好的进展

.thumb
.syntax unified

add r0,r1
adds r0,r1
adds r8,r1

00000000 <.text>:
   0:   eb00 0001   add.w   r0, r0, r1
   4:   1840        adds    r0, r0, r1
   6:   eb18 0801   adds.w  r8, r8, r1

嗯嗯。

.thumb
.syntax unified

add r0,r1
adds r0,r1
add r8,r1

00000000 <.text>:
   0:   eb00 0001   add.w   r0, r0, r1
   4:   1840        adds    r0, r0, r1
   6:   4488        add r8, r1

好吧,这只是令人不安。

.thumb
.syntax unified

add r0,r1
adds r0,r1
add.w r8,r1

00000000 <.text>:
   0:   eb00 0001   add.w   r0, r0, r1
   4:   1840        adds    r0, r0, r1
   6:   eb08 0801   add.w   r8, r8, r1

因此生成 0x18xx 和 0x44xx 指令并不难。汇编器并没有让生活变得轻松。如果你想要一个特定的指令,你应该把机器代码放在那里然后完成它。

编辑,叹息尝试了 Notlikethat 的建议

.thumb
.syntax unified

add.n r0,r1
add.n r8,r1

arm-none-eabi-as -mthumb so.s -o so.o
so.s: Assembler messages:
so.s:5: Error: cannot honor width suffix -- `add.n r0,r1'

失败

.thumb

add.n r0,r1
add.n r8,r1

arm-none-eabi-as -mthumb so.s -o so.o
so.s: Assembler messages:
so.s:4: Error: unexpected character `n' in type specifier
so.s:4: Error: bad instruction `add.n r0,r1'
so.s:5: Error: unexpected character `n' in type specifier
so.s:5: Error: bad instruction `add.n r8,r1'

失败

.thumb
.syntax unified

adds.n r0,r1
add.n r8,r1

00000000 <.text>:
   0:   1840        adds    r0, r0, r1
   2:   4488        add r8, r1

好的,知道了...

添加与添加,也很有意义,无论出于何种原因,添加 0x44xx 的高寄存器版本不会修改 0x18xx 低寄存器版本所做的标志。 ARMv7-m ARM 中的 ascii 汇编语言显示了这一点。

编辑 2,一位年长的手臂说

操作数限制 如果为and Rm (H1==0 and H2==0)指定了一个低位寄存器,结果是UNPREDICTABLE。因此,对于 armv4 和 armv5,我不会尝试编写您的 0x4408 指令,因为它不可预测。

armv7-m 文档没有这么说,所以理论上该体系结构没问题。不知道 armv6m 说的是什么。