Некоторые коды NOP обрабатываются иначе, чем другие?

12

Мне интересно, скажем, у меня есть:

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

Это выполняется точно так же, как это?

00000000001 0F1F00                          nop        dword [ds:rax]

Какой эффект будет иметь второй пример в отличие от первого?

Том Бубас
источник
1
Я был бы склонен думать, что вторая будет выполняться быстрее, чем первая, поскольку это одна инструкция, а не 3. Вполне возможно, что современный конвейер изменил бы это, хотя.
Лорен Печтел
1
Почему это помечено c ?
Кит Томпсон
Google для multi byte nop, появляется довольно много результатов.
phant0m
1
@KeithThompson - я вытащил C и теги в стиле кодирования; они не принадлежали.
@ phant0m - не могли бы вы поместить этот комментарий в ответ и суммировать некоторые из наиболее важных результатов? Не у всех нас есть фон, чтобы правильно понять, что будет возвращаться из этого поискового запроса.

Ответы:

2

Это зависит от архитектуры машины. У классического KA-10 (pdp-10) было много nop-кодов, вероятно, это следствие его очень регулярного набора команд и того факта, что все это было реализовано с помощью дискретных компонентов, а не микрокода. Некоторые NOP ссылались на память, некоторые были пропущенными тестами, которые никогда не пропускались, но, тем не менее, проверяли условие, которое могло вызвать пропуск, и так далее. «JFCL 0» было объявлено в руководстве как самый быстрый nop.

ddyer
источник
Однажды я работал над ассемблером (8085?), Который предлагал замену нескольких NOP одной инструкцией JMP. Вы получили требуемое выравнивание без уплаты штрафа за производительность. Удобно, когда у вас есть строки в PIC, не очень удобно, если у вас есть циклические циклы на основе процессора (именно поэтому он был выключен по умолчанию).
TMN
Чаще всего инструкция NOP используется для вставки короткой задержки, обычно в результате некоторой аппаратной зависимости или исправления ошибок устройства. Снижение производительности является причиной использования NOP.
до
1
У nops много эзотерического использования. Некоторые архитектуры имеют требования к выравниванию байтов для переходов. Самомодифицирующийся код (ужас!) Использовал nops как точки сращивания. Системы ошибок использовали nops для хранения информации о ошибочных утверждениях.
ddyer
@ddyer: у некоторых процессоров есть инструкции (иногда документированные, иногда нет), которые извлекают байт памяти и либо полностью игнорируют извлеченное значение, либо ничего с ним не делают, кроме установленных флагов, о которых программист может не заботиться. На 6502 было довольно распространено использовать инструкцию «BIT abs» как средство сожрать следующие два байта; Есть также некоторые недокументированные коды операций, которые ведут себя аналогично, за исключением того, что они не обновляют флаги. Одно предостережение с такими приемами: они приведут к считыванию байта адресного пространства. Некоторые 6502 периферийных устройства могут реагировать на операции чтения.
суперкат
0

Похоже, что второй пример должен выполняться быстрее, чем первый. В первом примере будут выполнены три отдельные инструкции. Во втором только одна инструкция. Многобайтовые NOP предназначены для использования в качестве «подсказок» ЦП (как именно и когда, по- видимому, конфиденциально ). Они могут быть полезны для целей выравнивания (для запуска жесткого цикла в строке кэша), но в настоящее время они не имеют другого использования. Неясно, действительно ли ЦП оценивает аргументы, поэтому невозможно сказать, увеличивает ли он время декодирования команд или налагает штраф за доступ к памяти. Кто-нибудь с хорошим ICE хочет протестировать один из них и посмотреть, какие адреса появляются на трассе шины?

TMN
источник
Хотя многие ассемблеры 6502 используют мнемонический «NOP» для недокументированных кодов операций, которые выполняют выборку из памяти (например, NOP $ 1FF9), будут двухбайтовой инструкцией, которая читает адрес 0x1FF9 и игнорирует считанное значение), я не ожидал бы, что производитель микросхем используйте термин «nop» для инструкции, которая делает что-либо, кроме продвижения счетчика программы / указателя инструкции, поскольку нет гарантии, что процессор не будет подключен к оборудованию, которое запускает действия (например, переключение на банк кода 1) при определенных адресах (например, 0x1FF9). ), и такой запуск не совсем "без операции".
суперкат