我正在实现二进制翻译,并且必须处理长度约为 16 个操作码的 NOP(0x90)序列。将 JMP(到结尾)放在此类序列的开头是否更好?
问问题
2487 次
3 回答
15
英特尔架构软件开发人员指南第 2B 卷(说明 NZ)包含下表(第 4-12 页)关于NOP
:
表 4-9。推荐的 NOP 指令多字节序列
长度组装字节序列 ==================================================== ================================ 2 字节 66 NOP 66 90H 3 字节 NOP DWORD ptr [EAX] 0F 1F 00H 4 字节 NOP DWORD ptr [EAX + 00H] 0F 1F 40 00H 5 字节 NOP DWORD ptr [EAX + EAX*1 + 00H] 0F 1F 44 00 00H 6 字节 66 NOP DWORD ptr [EAX + EAX*1 + 00H] 66 0F 1F 44 00 00H 7 字节 NOP DWORD ptr [EAX + 00000000H] 0F 1F 80 00 00 00 00H 8 字节 NOP DWORD ptr [EAX + EAX*1 + 00000000H] 0F 1F 84 00 00 00 00 00H 9 个字节 66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] 66 0F 1F 84 00 00 00 00 00H
这允许您构建NOP
特定大小的“填充”。使用其中两个,您可以桥接 16 字节,尽管我建议检查优化指南(针对您的目标 CPU)是否 aJMP
比两个这样的 快NOPs
。
于 2011-07-21T14:25:45.160 回答
4
如果NOP
s 要对齐流,那么它们的价值不仅仅是作为 NO OP。如果您关心纯速度,请参阅Agner Fog 的优化手册卷。4 .
于 2011-07-21T13:07:53.847 回答
1
作为二进制翻译,我将从翻译开始(将它们转换为目标系统上的等效 nop)。一旦一切正常,然后优化死代码。同时,由于这串指令引起了您的注意,请尝试了解它们的用途,也许等待硬件做某事,并确保您翻译的系统功能相同。
于 2011-07-21T14:25:17.657 回答