Что быстрее: JMP или строка NOP?

Я реализую двоичный перевод и должен иметь дело с последовательностями NOP (0x90) с длиной около 16 опкодов. Лучше ли для производительности разместить JMP (до конца) в начале таких последовательностей?

Ответы

Ответ 1

Руководство разработчика программного обеспечения Intel Architecture Software, том 2B (инструкции NZ) содержит следующую таблицу (стр. 4-12) о NOP:

Таблица 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

Это позволяет создавать "padding NOP" определенных размеров. С двумя из них вы можете объединить 16 байтов, хотя я рекомендую проверить направляющие оптимизации (для целевого сервера CPU), является ли JMP быстрее, чем два таких NOPs.

Ответ 2

Если NOP должен выровнять поток, тогда они имеют большее значение, чем просто отсутствие OP. если вы заинтересованы в чистой скорости, см. Agner Fog Optimization Manuals Vol. 4.

Ответ 3

являющийся двоичным переводом, я начинал с перевода (в эквивалентные nops в целевой системе). Когда все работает, оптимизируйте мертвый код. В то же время, поскольку эта последовательность инструкций привлекла ваше внимание, попробуйте понять, для чего они были, возможно, ожидая аппаратного обеспечения, чтобы что-то сделать, и убедитесь, что ваша переведенная система работает одинаково.