“NOP; jmp short“vs.”jmp short; NOP”


2

好的,首先让我直截了当:这不是微优化。

但是,我知道在分区上的引导程序中,很多都使用了 jmp short; nop 编码。但据我所知,jmp“跳”的数量越少,处理器完成所需的周期就越少,而且有些处理器看到了 0x90 并且在没有评估的情况下跳过它。

Answers:


2

你可能想看一下 英特尔64和IA-32架构软件开发人员手册 ,从程序员的角度来看,它们是理解x86架构的一个很好的资源(假设你已经对组装感到满意)。

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

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

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

并且一些处理器看到0x90并且在没有评估的情况下跳过它   它。

是的,这是什么的定义 NOP 应该做的指令。 CPU仍然需要获取 0x90 操作码,但评估基本上没有做任何事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.