好的,首先让我明确一点:这与微优化无关。
但是,我知道在分区上的引导加载程序中,很多都使用编码jmp short; nop
。但据我所知,jmp“跳跃”的次数越少 :) 处理器完成所需的周期越少,有些处理器看到后会0x90
跳过它而不进行评估。
答案1
你可能想看看Intel 64 和 IA-32 架构软件开发人员手册,它们是从程序员的角度理解 x86 架构的重要资源(假设您已经熟悉汇编)。
[...] 我的理解是,jmp“跳跃”的次数越少:)处理器完成所需的周期就越少
您需要区分近跳转和远跳转。近跳转只是向指令指针 (IP) 添加(或通过 2 的补码数学减去)偏移量,或从当前代码段 (CS) 重新加载 IP 偏移量。近跳转通常可以将偏移量存储在指令字本身或寄存器中 - 因此可以在一个周期内获取整个跳转指令。
远跳转将指令指针的实际新地址存储在下一个字或内存位置,因此这需要额外的提取 - 因此需要更长的时间。在 x86 和 x86-64 上,您可以不是远跳转到寄存器中保存的位置(它必须是下一个指令字或内存中的某个位置)。
有些处理器看到 0x90 就会跳过它而不进行评估。
是的,这就是指令应该做什么的定义NOP
。CPU 仍然必须获取0x90
操作码,但评估本质上不做任何事情。