mov%rax,%rax的目的是什么?

xis*_*xis 5 assembly gcc

我目前正在通过拆解一些C代码来学习ASM.我感兴趣的是gcc编译器生成这样的代码

movq %rax,%rax
Run Code Online (Sandbox Code Playgroud)

这显然毫无意义.那么这样做的目的是什么?

我想知道它是否用于浪费几个CPU周期以改善管道?

谢谢你的暗示!

Ano*_*on. 10

这基本上是无操作,是的.

编译器执行此操作是因为分支到4字节边界上对齐的地址比分支到未对齐地址更快.因此,如果你有一个循环,编译器将在它开始之前插入"填充",以使其对齐.

  • 因为标准NOP指令长1个字节,编译器需要2个字节用于填充.即使两个都是NOP,1指令也快于2.例如,常见的3字节NOP是`lea edi,[edi + 0]` (5认同)
  • 实际上,操作码0x90(对应于32位代码中的`xchg%eax,%eax`)*是x86-64上的专用NOP.如果对任何其他32位寄存器执行此操作,它将清除相应64位寄存器的前32位,但不会以"eax,eax"形式清零. (5认同)
  • x86没有"专用"nop指令.1字节NOP指令具有与xchg%eax,%eax`完全相同的操作码,并且对于其他nop大小也是如此.编译器选择具有正确大小的no-op来获得所需的填充量. (4认同)