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

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


person dc0    schedule 21.07.2011    source источник
comment
Есть ли причина, по которой вы не можете просто удалить NOP?   -  person DaMacc    schedule 21.07.2011


Ответы (3)


Руководство разработчика программного обеспечения архитектуры Intel, том 2B (инструкции, Новая Зеландия) содержит следующую таблицу (стр. 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

Это позволяет вам создавать «заполнение NOP» определенных размеров. С двумя из них вы можете соединить 16 байтов, хотя я поддерживаю предложение проверить руководства по оптимизации (для ЦП, на который вы ориентируетесь), является ли JMP быстрее, чем два таких NOPs.

person FrankH.    schedule 21.07.2011
comment
Я считаю, что 6-байтовая мнемоника должна быть nop ***word*** ptr [eax + eax*1 + 00H] (и то же самое для 9-байтовой записи). Не ваша вина, это, по-видимому, давние ошибки, происходящие из документов Intel. - person Glenn Slayden; 30.05.2018
comment
каким будет 66 NOP? NOP сама по себе представляет собой 1-байтовую последовательность для ничего не делающих, что я знаю. - person phil294; 23.07.2018

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

person Necrolis    schedule 21.07.2011

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

person old_timer    schedule 21.07.2011