每当我编译以下程序时:
.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
答案 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说的是什么。