“nop; jmp short” 与 “jmp short; nop”

“nop; jmp short” 与 “jmp short; nop”

好的,首先让我明确一点:这与微优化无关。

但是,我知道在分区上的引导加载程序中,很多都使用编码jmp short; nop。但据我所知,jmp“跳跃”的次数越少 :) 处理器完成所需的周期越少,有些处理器看到后会0x90跳过它而不进行评估。

答案1

你可能想看看Intel 64 和 IA-32 架构软件开发人员手册,它们是从程序员的角度理解 x86 架构的重要资源(假设您已经熟悉汇编)。

[...] 我的理解是,jmp“跳跃”的次数越少:)处理器完成所需的周期就越少

您需要区分近跳转和远跳转。近跳转只是向指令指针 (IP) 添加(或通过 2 的补码数学减去)偏移量,或从当前代码段 (CS) 重新加载 IP 偏移量。近跳转通常可以将偏移量存储在指令字本身或寄存器中 - 因此可以在一个周期内获取整个跳转指令。

远跳转将指令指针的实际新地址存储在下一个字或内存位置,因此这需要额外的提取 - 因此需要更长的时间。在 x86 和 x86-64 上,您可以不是远跳转到寄存器中保存的位置(它必须是下一个指令字或内存中的某个位置)。

有些处理器看到 0x90 就会跳过它而不进行评估。

是的,这就是指令应该做什么的定义NOP。CPU 仍然必须获取0x90操作码,但评估本质上不做任何事情。

相关内容