Чи деякі коди 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-кодів, ймовірно, наслідок його дуже регулярного набору інструкцій, а також того, що все це реалізовувалося окремими компонентами, а не мікрокодом. Деякі НОП посилаються на пам'ять, деякі - пропускні тести, які ніколи не пропускалися, але тим не менше перевіряли стан, який може спричинити пропуск тощо. "JFCL 0", рекламувався в посібнику як найшвидший ноп.


Одного разу я працював над асемблером (8085?), Який пропонував можливість замінити кілька NOP на одну інструкцію JMP. Ви отримали вирівнювання, яке хотіли, не сплачуючи штраф за виконання. Зручно, коли у вас були рядки в PIC, не так зручно, якщо у вас були тимчасові петлі на основі процесора (саме тому це було вимкнено за замовчуванням).
TMN

У більшості випадків інструкція NOP використовується для вставки короткої затримки, як правило, внаслідок деяких апаратних засобів або помилок пристрою. Штраф за виконання є причиною використання NOP.
uɐɪ

1
Нопс має багато езотеричного використання. Деякі архітектури мають вимоги до вирівнювання байтів для стрибків. Код, що самовиправлявся (жах!) Використовував нопс як точки злиття. Системи помилок використовували нопси для зберігання інформації про невдалі твердження.
ddyer

@ddyer: Деякі процесори мають інструкції (іноді задокументовані, іноді - ні), які отримують байт пам'яті і або повністю ігнорують отримане значення, або нічого не роблять з ним, крім встановлених прапорів, про які програміст може не піклуватися. На 6502 досить розповсюдженим було використання інструкції "BIT abs" як засобу збивання наступних двох байтів; Є також деякі недокументовані коди, які поводяться аналогічно, за винятком того, що вони не оновлюють жодних прапорів. Однак один застереження з такими хитрощами: вони змусять прочитати байт адресного простору. Деякі 6502 периферійні пристрої можуть реагувати на операції зчитування.
supercat

0

Здається, що другий приклад повинен працювати швидше, ніж перший. У першому прикладі будуть виконані три окремі інструкції. У другій лише одна інструкція. Багатобайтні NOP призначені для використання для "підказки" процесора (саме як і коли, мабуть, конфіденційно ). Вони можуть бути корисними для цілей вирівнювання (для початку щільної петлі на кеш-лінії), але наразі вони не мають іншого використання. Незрозуміло, чи дійсно ЦП оцінює аргументи, тому не можна сказати, збільшує він час розшифровки інструкцій або несе штрафну пам'ять. Хтось із хорошим ICE хоче перевірити один із них і подивитися, які адреси спливають на трасі шини?


Хоча багато асемблерів 6502 використовують мнемічний "NOP" для недокументованих опкодів, які виконують витяг пам'яті (наприклад, NOP $ 1FF9), буде двобайтовою інструкцією, яка зчитує адресу 0x1FF9 та ігнорує прочитане значення), я б не очікував, що виробник чіпів використовуйте термін "nop" для інструкції, яка робить все, що не перевищує попередній лічильник програми / покажчик інструкцій, оскільки немає гарантії, що процесор не буде підключений до обладнання, яке запускає дії (наприклад, перехід на банк 1 коду), коли певні адреси (наприклад, 0x1FF9 ) мають доступ, і таке запускання не є точно "відсутністю операції".
supercat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.