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