12

我正在实现二进制翻译,并且必须处理长度约为 16 个操作码的 NOP(0x90)序列。将 JMP(到结尾)放在此类序列的开头是否更好?

4

3 回答 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

如果NOPs 要对齐流,那么它们的价值不仅仅是作为 NO OP。如果您关心纯速度,请参阅Agner Fog 的优化手册卷。4 .

于 2011-07-21T13:07:53.847 回答
1

作为二进制翻译,我将从翻译开始(将它们转换为目标系统上的等效 nop)。一旦一切正常,然后优化死代码。同时,由于这串指令引起了您的注意,请尝试了解它们的用途,也许等待硬件做某事,并确保您翻译的系统功能相同。

于 2011-07-21T14:25:17.657 回答