Мне интересно, скажем, у меня есть:
00000000001 90 nop
00000000002 90 nop
00000000003 90 nop
Это выполняется точно так же, как это?
00000000001 0F1F00 nop dword [ds:rax]
Какой эффект будет иметь второй пример в отличие от первого?
multi byte nop
, появляется довольно много результатов.Ответы:
Это зависит от архитектуры машины. У классического KA-10 (pdp-10) было много nop-кодов, вероятно, это следствие его очень регулярного набора команд и того факта, что все это было реализовано с помощью дискретных компонентов, а не микрокода. Некоторые NOP ссылались на память, некоторые были пропущенными тестами, которые никогда не пропускались, но, тем не менее, проверяли условие, которое могло вызвать пропуск, и так далее. «JFCL 0» было объявлено в руководстве как самый быстрый nop.
источник
Похоже, что второй пример должен выполняться быстрее, чем первый. В первом примере будут выполнены три отдельные инструкции. Во втором только одна инструкция. Многобайтовые NOP предназначены для использования в качестве «подсказок» ЦП (как именно и когда, по- видимому, конфиденциально ). Они могут быть полезны для целей выравнивания (для запуска жесткого цикла в строке кэша), но в настоящее время они не имеют другого использования. Неясно, действительно ли ЦП оценивает аргументы, поэтому невозможно сказать, увеличивает ли он время декодирования команд или налагает штраф за доступ к памяти. Кто-нибудь с хорошим ICE хочет протестировать один из них и посмотреть, какие адреса появляются на трассе шины?
источник