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 GNU ARM汇编程序将mov更改为adds?_Assembly_Encoding_Arm_Gnu_Thumb - Fatal编程技术网

Assembly GNU ARM汇编程序将mov更改为adds?

Assembly GNU ARM汇编程序将mov更改为adds?,assembly,encoding,arm,gnu,thumb,Assembly,Encoding,Arm,Gnu,Thumb,社区 我有以下一行源文件,名为first.S mov R1, R2 我生成一个对象文件,如下所示: $ arm-none-eabi-as -mcpu=cortex-m3 -march=armv7 -mthumb -c -o first.o first.S 然后,我把它拆开 $ arm-none-eabi-objdump -d first.o first.o: file format elf32-littlearm Disassembly of section .text:

社区

我有以下一行源文件,名为
first.S

mov R1, R2
我生成一个对象文件,如下所示:

$ arm-none-eabi-as -mcpu=cortex-m3 -march=armv7 -mthumb -c -o first.o first.S 
然后,我把它拆开

$ arm-none-eabi-objdump -d first.o

first.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   1c11        adds    r1, r2, #0
$arm none eabi objdump-d first.o
first.o:文件格式elf32 littlearm
第节的分解。正文:
00000000 :
0:1c11加上r1,r2,#0
显然,本例中的两条指令(
mov
add
)具有相同的预期效果

但问题是:为什么

根据ARMv7-M体系结构参考手册,mov寄存器指令存在多种编码,但汇编程序选择将其编码为
add
指令

在任何文件中是否有描述此类决定的地方

谢谢

与中一样,move指令的操作码也是2字节,因此使用这两种代码都没有好处。表示两条指令都使用1个CPU周期来完成

然而,编码T2会有一个空字节,这在某些情况下是不好的(利用漏洞)


然而,我可以想象,构建一个汇编程序越容易,它将产生的操作码就越少。

从thumb指令集的开始,编码

0001110xxxnnnddd 
是一个

如果修改标志对您来说是合适的,那么它是更有效的编码

伪指令mov rd,rn表示标志可以更改(文档中的每个arms asm和gas)。所以原始编码是好的

现在由反汇编程序选择if immed==0,然后打印mov rd,rn vs adds rd,rn,#0,这两个都是正确的分解

现在,一个寄存器高一个寄存器低的mov表示:

Unlike the low register MOV instruction described in MOV (2) on page A7-73, this instruction does not change the flags.
现在它进入了完全由汇编程序定义的汇编语言,而不是目标(不是ARM),以及可怕的统一语法等等。所以现在它变成了一个特定于工具的东西。Gnu assembler for thumb不喜欢添加,例如(非统一语法,我发现对于thumb更容易使用),您可以执行添加并获得添加

.thumb
add r0,r1,#0
mov r0,r1
adds r0,r1,#0
movs r0,r1

arm-none-eabi-as so.s -o so.o
so.s: Assembler messages:
so.s:5: Error: instruction not supported in Thumb16 mode -- `adds r0,r1,#0'

.thumb
add r0,r1,#0
mov r0,r1
movs r0,r1

00000000 <.text>:
   0:   1c08        adds    r0, r1, #0
   2:   1c08        adds    r0, r1, #0
   4:   1c08        adds    r0, r1, #0
因此,在本例中,它是一种不同的汇编语言(相同的工具不同的汇编语言)

因此,这种汇编语言尊重add vs adds和mov vs mov

为了在不使用flahs的情况下进行添加,需要使用thumb2编码。不带标志的mov为高位寄存器mov 0x4608 0100011000010000 0x46xx

adds和往常一样,mov现在被编码为左移,但它们并没有分解lsl r0,r1,#0,而是分解为mov r0,r1,让您更仔细地思考,而不仅仅是将mov分解为add。他们为什么不使用adds?这是另一个问题,如果你看一下mov low registers指令,至少在旧的arm中,它描述了它显示的adds编码的标志发生了什么。但是如果你看一下lsl的描述,标志是不同的,lsl并不是mov的替代品,至少在最长寿的手臂(拇指)上是这样描述的

好的,这是有道理的,他们在老年人中很有帮助。如果立即数为零,则没有执行,因此它被描述为与有符号溢出标志一起设置为零

Lsl在一个文档和另一个文档中显示进位不变,而不是零。因此,也许随着时间的推移,指令的执行发生了一些变化,或者某个ARM错误(这种情况经常发生)


简而言之,mov-rd,rn一直是一条伪指令,记录为adds,反汇编程序可以选择任何一种方式将其打印出来,这取决于反汇编程序

汇编语言是由工具而不是目标定义的,因此该工具确定在其语法中使用哪个标志解决方案,并可以在加法、mov高位寄存器、thumb2编码或其他编码之间进行选择

我们不知道,为什么会有这样的问题,为什么选择一种编码而不是另一种编码,在可能有相同编码的情况下,通常会选择较短的编码(thumb与thumb2扩展名)(x86中的xor与以零为立即数的mov立即数)。但是lsl vs add vs sub vs

您可以在arm文档中找到其他伪指令(记录当时其工具的汇编语言),以及汇编程序添加到其汇编语言(如nop)中的伪指令

.thumb
nop
mov r8,r8
mov r4,r4

00000000 <.text>:
   0:   46c0        nop         ; (mov r8, r8)
   2:   46c0        nop         ; (mov r8, r8)
   4:   1c24        adds    r4, r4, #0
我还喜欢反汇编程序如何将分号暗示为注释边界,而汇编语言却奇怪地不支持分号(就像地球上的所有其他汇编程序一样(大多数情况下))


假定反汇编程序不知道创建机器代码的汇编程序是什么,因此对于有伪指令同时显示这两个指令的情况,最好。

指令集参考描述了应该使用的指令。它在ARMv6中从
添加Rd,Rn,#0
更改为
lsls Rd,Rn,#0
,现在有了真正的非标志设置
mov Rd,Rn
使用先前Hi/Lo寄存器移动指令的扩展形式。@fuz I设法在2005年《ARM体系结构参考手册》的Thumb2增补部分中找到了从
mov
add
的更改参考。谢谢
.syntax unified
.thumb
add r0,r1,#0
mov r0,r1
adds r0,r1,#0
movs r0,r1


   0:   f101 0000   add.w   r0, r1, #0
   4:   4608        mov r0, r1
   6:   1c08        adds    r0, r1, #0
   8:   0008        movs    r0, r1
.thumb
nop
mov r8,r8
mov r4,r4

00000000 <.text>:
   0:   46c0        nop         ; (mov r8, r8)
   2:   46c0        nop         ; (mov r8, r8)
   4:   1c24        adds    r4, r4, #0
   0:   1c08        mov r0,r1  ; (adds r0, r1, #0)