我认为它们都能达到同样的效果,但 mov 会更容易阅读,因此更经常使用(不是机器关心它,对吗?)但是,当看到一些反汇编的代码,我经常注意到add r-something, r-something, #0
被使用了。
是否存在这样的原因,或者只是编译器为那些希望阅读汇编代码的人们带来了生活困难?
修改
我正在拆卸ARM Thumb。具体来说,它是movs r7, r1
并添加了r7, r1, #0
。随后没有使用条件标志。这两者的十六进制分别为000f
和1c0f
。我想我应该指定我在谈论哪个指令集= x
答案 0 :(得分:3)
将(部分)取决于您正在谈论的处理器。例如,在某些情况下,处理器中实际上没有MOV指令;汇编程序将其转换为您描述的add-0,这样当您反汇编时,您无法分辨原始汇编代码中的指令是如何指定的。
答案 1 :(得分:3)
编译代码需要考虑的另一点是指令调度 - 出于性能原因,编译器可能会根据周围的代码选择不同的指令来执行“相同”的操作。说你有类似的东西:
MOV r0, r1
MOV r2, r3
具有相当受限管道的简单CPU可能一次只能执行一个MOV
,但可能能够双重发出某些算术指令,因此这样做:
MOV r0, r1
ADD r2, r3, #0
这两个指令可以在同一个周期内执行,代码的速度是其两倍。
在ARM上 1 MOV rd,rm
实际上是LSL rd, rm, #0
,因此作为通用优化交错MOV
和ADD
这种方式可能是净收益任何可以并行处理移位器和加法器的东西,对于不能严格标量的有序核心没有任何不利。
[1]至少在概念上,对于ARM和Thumb中的“基本”编码 - 为简单起见,我正在忽略标志设置以及IT块和高regs与低regs并发症存在的其他Thumb编码