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