我目前正在通过反汇编一些C代码来学习汇编语言。有一件事引起了我的兴趣,那就是gcc编译器生成的代码看起来像这样:
movq %rax,%rax
这显然是毫无意义的。那么这样做的目的是什么?
我想知道这是否用于浪费几个 CPU 周期以提高流水线的性能?
谢谢您的提示!
我目前正在通过反汇编一些C代码来学习汇编语言。有一件事引起了我的兴趣,那就是gcc编译器生成的代码看起来像这样:
movq %rax,%rax
这显然是毫无意义的。那么这样做的目的是什么?
我想知道这是否用于浪费几个 CPU 周期以提高流水线的性能?
谢谢您的提示!
基本上它什么也不做,是的。
编译器这样做是因为跳转到一个按4字节边界对齐的地址比跳转到未对齐的地址更快。因此,如果你有一个循环,编译器会在其开始之前插入“填充”,以使其对齐。
xchg %eax,%eax
具有完全相同的操作码,其他尺寸的nop也是如此。编译器会选择正确大小的无操作指令以便填充所需的空间。 - Anon.lea edi, [edi + 0]
гҖӮ - ruslikxchg %eax, %eax
)在x86-64上确实是一个专用的NOP指令。如果你使用其他32位寄存器执行此操作,它将清除相应64位寄存器的前32位,但在“eax,eax”的形式中不会这样做。 - Fabian Giesen