Assembly 英特尔处理器的虚拟操作处理

Assembly 英特尔处理器的虚拟操作处理,assembly,x86,intel,computer-architecture,instruction-set,Assembly,X86,Intel,Computer Architecture,Instruction Set,诚然,我有一个有点愚蠢的问题。基本上,我想知道 英特尔处理器提供了一些特殊机制,可以有效地 执行一系列伪指令,即NOP指令?例如,我可以想象那里 可能是某种预取机制,识别NOP,丢弃它们 并尝试获取一些有用的指令。还是这些NOP已经发出 作为普通指令发送到执行单元,这意味着我可以大致处理 每个循环5个NOP(假设有5个执行单元) 谢谢, Reinhard否。它们被解码并作为正常指令执行;有硬件支持来删除错误的依赖项,否则会在EAX寄存器上引入单字节NOP 0x90(实际上是xchg-EAX,EA

诚然,我有一个有点愚蠢的问题。基本上,我想知道 英特尔处理器提供了一些特殊机制,可以有效地 执行一系列伪指令,即NOP指令?例如,我可以想象那里 可能是某种预取机制,识别NOP,丢弃它们 并尝试获取一些有用的指令。还是这些NOP已经发出 作为普通指令发送到执行单元,这意味着我可以大致处理 每个循环5个NOP(假设有5个执行单元)

谢谢,
Reinhard

否。它们被解码并作为正常指令执行;有硬件支持来删除错误的依赖项,否则会在EAX寄存器上引入单字节NOP 0x90(实际上是
xchg-EAX,EAX
),但仅此而已


参考资料:-第3.5.1.8节,“使用NOP”。

丢弃它们将是一个非常糟糕的主意:它们通常用于繁忙的等待。如果放弃NOPs,则会使等待循环比应该的更紧密,并且可能会引入相当大的通信开销


如果您觉得
NOP
s效率低下,可以尝试
HLT
,这样可以节省一些能源。或者您甚至可以将CPU发送到睡眠状态。但是,只有当您想在相当长的时间内“什么都不做”并且通常需要suvervisor特权时,这些才有意义。

在x86体系结构上没有优化无操作序列的必要,因为它没有不同长度的操作编码。与许多单字节no-op不同,我们可以只使用一个多字节no-op。解码器需要做更多的工作,但实际执行单元只能看到一条要执行的指令。

谢谢您的回答。从性能角度看,使用多字指令与使用多个NOP指令是否有区别?或者从代码大小的角度来看这很有趣?很难说多字节NOP的性能影响到底是什么。我不知道它们是否都能通过简单的解码器路径(你可能会在某个地方找到)。如果它们需要复杂的解码器路径,并且已经饱和,那么最好使用两个较小的NOP。实际上,通过长NOP支持,您可以制作一个大小为1到15字节的NOP。如果需要跳过更大的空间,那么使用JMP而不是NOP。