ARM汇编程序将Thumb指令传输到Thumb2

时间:2016-06-28 14:38:01

标签: assembly arm thumb

每当我编译以下程序时:

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

我得到以下二进制输出:

ADD.W R0, R0, R1

这意味着我的汇编程序将16位代码传输到32位代码。 我想知道为什么我的汇编程序表现得那样,而不是将代码编译为16位指令" 08 44"

我使用以下命令运行程序集:

  

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

1 个答案:

答案 0 :(得分:2)

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

好吧,明白了......

和add vs添加也是有道理的,无论出于何种原因,添加0x44xx的高寄存器版本都不会修改0x18xx低位寄存器的标志。 ARMv7-m ARM中的ascii汇编语言显示了这一点。

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

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

armv7-m doc并没有这么说,理论上这个架构还可以。不知道armv6m说的是什么。