我正在实现二进制转换,并且必须处理长度约为16个操作码的NOP序列(0x90)。在这样的序列开始时将JMP放到最后是否更好?
答案 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)。一旦工作正常,然后优化死代码。同时,由于这一系列指令引起了你的注意,试着去了解它们的用途,或许等待硬件做某事,并确保你的翻译系统的功能相同。