Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly ARM汇编程序将Thumb指令传输到Thumb2_Assembly_Arm_Thumb - Fatal编程技术网

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