Assembly ARM汇编程序将Thumb指令传输到Thumb2
每当我编译以下程序时:Assembly ARM汇编程序将Thumb指令传输到Thumb2,assembly,arm,thumb,Assembly,Arm,Thumb,每当我编译以下程序时: .syntax unified .section .text _start: ADD R0, R1 我得到以下二进制输出: ADD.W R0, R0, R1 这意味着我的汇编程序将16位代码转换为32位代码。 我想知道为什么我的汇编程序没有将代码编译成16位指令“0844”,而是这样运行 我使用以下命令运行程序集: arm none eabi as-o输出.o-m拇指-EL输入.s 有趣的 add r0,r1 add r0,r1 add r8,r1 00000000
.syntax unified
.section .text
_start:
ADD R0, R1
我得到以下二进制输出:
ADD.W R0, R0, R1
这意味着我的汇编程序将16位代码转换为32位代码。
我想知道为什么我的汇编程序没有将代码编译成16位指令“0844”,而是这样运行
我使用以下命令运行程序集:
arm none eabi as-o输出.o-m拇指-EL输入.s
有趣的
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
.语法统一
添加.n r0,r1
add.n r8,r1
00000000 :
0:1840加上r0,r0,r1
2:4488加上r8,r1
好的,我明白了
而add vs adds也有意义,无论出于何种原因,您所追求的add的高寄存器版本0x44xx不会修改0x18xx低寄存器版本的标志。ARMv7-m ARM中的ascii汇编语言显示了这一点
编辑2,一个老的手臂说
操作数限制如果为和Rm(H1==0和H2==0)指定低寄存器,则结果不可预测。因此,对于armv4和armv5,我不会尝试使用0x4408指令,因为它是不可预测的
armv7-m文档并没有这样说,因此在理论上对该体系结构来说是可以的。不知道armv6m是怎么说的
有趣的
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
.语法统一
添加.n r0,r1
add.n r8,r1
00000000 :
0:1840加上r0,r0,r1
2:4488加上r8,r1
好的,我明白了
而add vs adds也有意义,无论出于何种原因,您所追求的add的高寄存器版本0x44xx不会修改0x18xx低寄存器版本的标志。ARMv7-m ARM中的ascii汇编语言显示了这一点
编辑2,一个老的手臂说
操作数限制如果为和Rm(H1==0和H2==0)指定低寄存器,则结果不可预测。因此,对于armv4和armv5,我不会尝试使用0x4408指令,因为它是不可预测的
armv7-m文档并没有这样说,因此在理论上对该体系结构来说是可以的。不知道armv6m是怎么说的。2字节拇指加法设置标志。如果你写
adds r0,r1
,你应该会得到一条16位指令。这仍然不能解释为什么汇编程序不将ADD r0,r1
转换为08 44
它完美地解释了这一点基于寄存器的thumb ADD指令修改标志,你要求的thumb指令不修改标志(ADD vs adds)因此,如果你的目标支持thumb2指令,你必须使用arm指令。汇编程序按照你告诉它的做了,这就是为什么。如果您想让它做其他事情,然后告诉它做其他事情,没有s的add永远不能等于0x44xx指令。再进一步说,因为两个寄存器都在r0和r7之间,所以它也不太可能选择0x44xx指令。如果需要0x44xx指令,请告诉汇编程序使用正确的汇编语法。FWIW,显式使用.n
后缀也会迫使汇编程序选择16位编码,如果不能,则会给出错误。2字节的thumb加法设置标志。如果你写adds r0,r1
,你应该会得到一条16位指令。这仍然不能解释为什么汇编程序不将ADD r0,r1
转换为08 44
它完美地解释了这一点基于寄存器的thumb ADD指令修改标志,你要求的thumb指令不修改标志(ADD vs adds)因此,如果你的目标支持thumb2指令,你必须使用arm指令。汇编程序按照你告诉它的做了,这就是为什么。如果您想让它做其他事情,然后告诉它做其他事情,没有s的add永远不能等于0x44xx指令。再进一步说,因为两个寄存器都在r0和r7之间,所以它也不太可能选择0x44xx指令。如果需要0x44xx指令,请告诉汇编程序使用正确的汇编语法。FWIW,显式使用.n
后缀也会迫使汇编程序选择16位编码,如果不能,则会给出错误。汇编语言由汇编程序定义,即读取它的程序。程序会随着时间的推移而变化,来自两个不同个人/团体/公司的两个不同的汇编程序不会做相同的事情,也不会支持相同的语法,不幸的是,thumb和arm以及这种统一的东西,以及时间的推移和代码的更改,你只需要做上面的事情就可以弄清楚了。不要期望结果保持不变,显然我们中的一些人记得你做加法或不做加法之类的事情。汇编语言是由汇编程序定义的,即读取它的程序。程序会随着时间的推移而变化,来自两个不同个人/团体/公司的两个不同的汇编程序不会做相同的事情,也不会支持相同的语法,不幸的是,thumb和arm以及这种统一的东西,以及时间的推移和代码的更改,你只需要做上面的事情就可以弄清楚了,不要指望结果会保持不变,很明显,我们中的一些人记得你什么时候做了加法,什么时候没做。
.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
.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