什么是更快:JMP或NOP串?

时间:2011-07-21 12:57:15

标签: assembly opcode

我正在实现二进制转换,并且必须处理长度约为16个操作码的NOP序列(0x90)。在这样的序列开始时将JMP放到最后是否更好?

3 个答案:

答案 0 :(得分:13)

Intel Architecture Software developer's guide, volume 2B (instructions N-Z)包含关于NOP的下表(第4-12页):

表4-9。推荐的NOP指令多字节序列

Length    Assembly                                   Byte Sequence
=================================================================================
2 bytes   66 NOP                                     66 90H
3 bytes   NOP DWORD ptr [EAX]                        0F 1F 00H
4 bytes   NOP DWORD ptr [EAX + 00H]                  0F 1F 40 00H
5 bytes   NOP DWORD ptr [EAX + EAX*1 + 00H]          0F 1F 44 00 00H
6 bytes   66 NOP DWORD ptr [EAX + EAX*1 + 00H]       66 0F 1F 44 00 00H
7 bytes   NOP DWORD ptr [EAX + 00000000H]            0F 1F 80 00 00 00 00H
8 bytes   NOP DWORD ptr [EAX + EAX*1 + 00000000H]    0F 1F 84 00 00 00 00 00H
9 bytes   66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] 66 0F 1F 84 00 00 00 00 00H

这允许您构造特定大小的“填充NOP”。使用其中两个,您可以桥接16个字节,但我建议检查优化指南(对于您要定位的CPU),JMP是否比两个NOPs更快。

答案 1 :(得分:4)

如果NOP要对齐流,那么它们的价值不仅仅是NO OP。如果您关注纯粹的速度,请参阅Agner Fog's Optimization Manuals Vol. 4

答案 2 :(得分:1)

作为二进制翻译我将从翻译开始(在目标系统上将它们转换为等价的nops)。一旦工作正常,然后优化死代码。同时,由于这一系列指令引起了你的注意,试着去了解它们的用途,或许等待硬件做某事,并确保你的翻译系统的功能相同。