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

6

我目前正在通过反汇编一些C代码来学习汇编语言。有一件事引起了我的兴趣,那就是gcc编译器生成的代码看起来像这样:

movq %rax,%rax

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

我想知道这是否用于浪费几个 CPU 周期以提高流水线的性能?

谢谢您的提示!


这不用于改进流水线。所有x86处理器(由于历史原因?)都具有硬件,在必要时解决这些风险,即停顿。只有RISC体系结构比较简单,才需要编译器支持来处理这个问题。 - ruslik
1
@ruslik:摊位本身就是一个危险因素。 - Stephen Canon
1个回答

11

基本上它什么也不做,是的。

编译器这样做是因为跳转到一个按4字节边界对齐的地址比跳转到未对齐的地址更快。因此,如果你有一个循环,编译器会在其开始之前插入“填充”,以使其对齐。


看起来是一个合理的解释。但为什么不使用NOP指令呢? - xis
4
x86指令集没有专门的nop指令。1字节的NOP指令与xchg %eax,%eax具有完全相同的操作码,其他尺寸的nop也是如此。编译器会选择正确大小的无操作指令以便填充所需的空间。 - Anon.
5
еӣ дёәж ҮеҮҶзҡ„NOPжҢҮд»Өй•ҝеәҰдёә1дёӘеӯ—иҠӮпјҢиҖҢзј–иҜ‘еҷЁйңҖиҰҒ2дёӘеӯ—иҠӮзҡ„еЎ«е……гҖӮеҚідҪҝдёӨдёӘйғҪжҳҜNOPпјҢ1дёӘжҢҮд»ӨжҜ”2дёӘжҢҮд»Өжӣҙеҝ«гҖӮдҫӢеҰӮпјҢеёёи§Ғзҡ„3дёӘеӯ—иҠӮNOPжҳҜlea edi, [edi + 0]гҖӮ - ruslik
5
实际上,opcode 0x90(对应于32位代码中的xchg %eax, %eax)在x86-64上确实是一个专用的NOP指令。如果你使用其他32位寄存器执行此操作,它将清除相应64位寄存器的前32位,但在“eax,eax”的形式中不会这样做。 - Fabian Giesen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接