知道 Intel 和 AMD 处理器以它们的本机字长(现在主要是 64 位)获取指令,我问了我的兄弟,他说为了让处理器更有效地运行,一些汇编程序员将他们的指令填充到 32 位nop
s 如果下一条指令将字节长度设置为超过 4 或 8 个字节:
xor ax, ax ; 2 bytes
nop ; 1
nop ; 1
那么这样做有什么好处吗?
知道 Intel 和 AMD 处理器以它们的本机字长(现在主要是 64 位)获取指令,我问了我的兄弟,他说为了让处理器更有效地运行,一些汇编程序员将他们的指令填充到 32 位nop
s 如果下一条指令将字节长度设置为超过 4 或 8 个字节:
xor ax, ax ; 2 bytes
nop ; 1
nop ; 1
那么这样做有什么好处吗?
在您的示例中没有理由使用 nop 指令。通常,指令对齐的唯一用途是最大化在控制流分支(例如函数调用)的目标处获取的指令数量。现代 x86 获取和解码单元针对 x86 编码的可变长度特性进行了很好的优化。像这样的填充只会减慢速度。
对英特尔第 4 卷优化手册的扫描(可能已经过时几年)没有提供任何指令填充的理由。
是的,它可以显着提高 AMD Bulldozer 和 Intel Atom 的性能,并在较小程度上提高 Intel Core 2 和 Nehalem 的性能。Bulldozer 和 Core 2 在 16 字节边界上对齐,对于 Atom 在 8 字节边界上对齐。然而,最好使用附加前缀或更长的指令形式而不是 NOP。请注意,仅当您需要超过一半的峰值 IPC 时,对齐指令才有意义。