Assembly 加上r0,r1,#0与移动r0,r1?

Assembly 加上r0,r1,#0与移动r0,r1?,assembly,arm,Assembly,Arm,我认为它们都达到了相同的效果,但是mov更容易阅读,因此使用更频繁(机器并不关心这一点,对吧?),然而,当查看一些反汇编代码时,我经常注意到使用添加r-something,r-something,#0 这是有原因的吗?或者只是编译器让那些希望阅读汇编代码的人日子不好过 编辑: 我正在拆卸手臂拇指。具体来说,它是movsr7,r1,并添加r7,r1,#0。之后不使用条件标志。这两个的十六进制分别为000f和1c0f。我想我应该指定我所说的指令集=x(部分)取决于您所说的处理器。例如,在某些情况下,

我认为它们都达到了相同的效果,但是mov更容易阅读,因此使用更频繁(机器并不关心这一点,对吧?),然而,当查看一些反汇编代码时,我经常注意到使用
添加r-something,r-something,#0

这是有原因的吗?或者只是编译器让那些希望阅读汇编代码的人日子不好过

编辑:


我正在拆卸手臂拇指。具体来说,它是
movsr7,r1
,并添加
r7,r1,#0
。之后不使用条件标志。这两个的十六进制分别为
000f
1c0f
。我想我应该指定我所说的指令集=x(部分)取决于您所说的处理器。例如,在某些情况下,处理器中实际上没有MOV指令;汇编程序将其转换为您描述的add-0,因此当您进行反汇编时,您无法知道该指令是如何在原始汇编代码中指定的。

将(部分)取决于您所谈论的处理器。例如,在某些情况下,处理器中实际上没有MOV指令;汇编程序将其转换为您描述的add-0,因此,当你解体时,你无法判断在原始汇编代码中是如何指定的。

< P>另一个要考虑编译代码的点是指令调度——编译器可以根据性能原因根据周围代码选择不同的指令来做相同的事情。假设你有类似于:

MOV r0, r1
MOV r2, r3
具有相当有限管道的简单CPU一次可能只能执行一个
MOV
,但可以双重发出某些算术指令,因此通过执行此操作:

MOV r0, r1
ADD r2, r3, #0
这两条指令可以在同一个周期内执行,代码的速度是原来的两倍

在ARM1
MOV-rd上,rm
实际上是
LSL-rd,rm,#0
,因此作为一种通用优化,交错
MOV
ADD
,这种方式对于任何可以并行流水线传输移位器和加法器的东西来说都可能是一种净增益,而对于不能并行处理的严格标量顺序内核来说,没有任何缺点



[1] 至少在概念上,对于简单的“手臂”和“拇指”的“基本”编码来说,为了简化它,我设置了标志设置和其他对它存在的拇指编码和高RESs与低RESS并发症。

< P>另一个用编译代码考虑的是指令调度——编译器可以选择不同的指令来做“相同”的事情。基于性能原因,请参阅周围的代码。假设你有类似于:

MOV r0, r1
MOV r2, r3
具有相当有限管道的简单CPU一次可能只能执行一个
MOV
,但可以双重发出某些算术指令,因此通过执行此操作:

MOV r0, r1
ADD r2, r3, #0
这两条指令可以在同一个周期内执行,代码的速度是原来的两倍

在ARM1
MOV-rd上,rm
实际上是
LSL-rd,rm,#0
,因此作为一种通用优化,交错
MOV
ADD
,这种方式对于任何可以并行流水线传输移位器和加法器的东西来说都可能是一种净增益,而对于不能并行处理的严格标量顺序内核来说,没有任何缺点



[1] 至少从概念上讲,对于ARM和Thumb中的“基本”编码,为了简单起见,我省略了标志设置和其他Thumb编码,它们分别适用于块、高regs和低regs复杂情况。

在大多数RISC平台上,这两条指令实际上不是组装成完全相同的操作码吗?反汇编程序只是选择了最字面的翻译我想,这是反汇编程序,它不能反转所有的宏展开。。。您可以将mov视为宏,因为一些具有
ADD rA,rB,#0
的CPU通常没有
mov rA,rB
硬线指令。啊。。谢谢你的回答!但是,我正在拆卸手臂拇指。具体来说,它是
movsr7,r1
,并且
添加了r7,r1,#0
。之后不使用条件标志。这两个的十六进制分别为
000f
1c0f
。我想我应该指定我说的是哪个指令集=x,这就像用来实现相同目标的指令看起来更。。不一致。您使用什么优化级别?如果您使用的是
-O0
,那么编译器通常会做一些奇怪的事情。编译器输出的汇编可读性几乎从来都不是设计目标。如果指令在相同或更短的时间内执行,编译器将使用它。它不在乎它在人类看来是什么样子。例如,为了更快地编译,
addrx,ry,#N
可以按有时会添加非零的顺序进行。大多数程序员的编译速度更快。在特殊情况下,编译器逻辑会减慢编译速度。在大多数RISC平台上,这两条指令不是实际上组装成完全相同的操作码吗?反汇编程序只是选择了最字面的翻译我想,这是反汇编程序,它不能反转所有的宏展开。。。您可以将mov视为宏,因为一些具有
ADD rA,rB,#0
的CPU通常没有
mov rA,rB
硬线指令。啊。。谢谢你的回答!但是,我正在拆卸手臂拇指。具体来说,它是
movsr7,r1
,并且
添加了r7,r1,#0
。之后不使用条件标志。这两个的十六进制分别为
000f
1c0f
。我想我应该指定我说的是哪个指令集=x,这就像用来实现相同目标的指令看起来更。。不一致。您使用什么优化级别?如果您使用的是
-O0
,那么编译器通常会做一些奇怪的事情。汇编程序读取