Я реализую двоичный перевод и должен иметь дело с последовательностями NOP (0x90) с длиной около 16 опкодов. Лучше ли для производительности разместить JMP (до конца) в начале таких последовательностей?
Что быстрее: JMP или строка NOP?
Ответ 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 в целевой системе). Когда все работает, оптимизируйте мертвый код. В то же время, поскольку эта последовательность инструкций привлекла ваше внимание, попробуйте понять, для чего они были, возможно, ожидая аппаратного обеспечения, чтобы что-то сделать, и убедитесь, что ваша переведенная система работает одинаково.