nop
псевдоlyszt.net охоплює nop та інші інструкції RISC-V більш детально.
Опис
nop нічого не робить. Назва скорочує "no operation" (без операції). Коли процесор досягає nop, жоден регістр не змінюється, пам'ять не зачіпається, а виконання продовжується з наступної інструкції. Він займає один слот у програмі, і минає один такт часу.
nop — це псевдоінструкція для рядка нижче.
addi zero, zero, 0
RISC-V містить регістр під назвою zero, який завжди зберігає 0. Читання повертає 0, а запис відкидається. Ця addi додає 0 і 0 та відкидає результат, тому інструкція завершується і нічого не змінюється. RISC-V не потребує окремого nop, бо регістр zero його забезпечує.
Справжні процесори використовують nop як заповнення, щоб пізніша інструкція починалася на межі пам'яті, яку апаратне забезпечення обробляє швидше, і як заповнювачі, які інструменти згодом перезаписують справжніми інструкціями. Компілятори вставляють їх як належне, тому дизасембльований код містить їх, навіть якщо жоден програміст їх не набирав.
Посібник RISC-V стверджує, що nop не змінює жодного архітектурно видимого стану, тобто нічого, що програма може спостерігати, крім просування pc та збільшення будь-яких лічильників продуктивності. Він наводить два застосування: вирівнювання сегментів коду за межами адрес, які підходять апаратному забезпеченню, та залишення місця для подальших змін коду. Посібник пояснює, що кодування використовує addi, бо ця інструкція коштує найменше ресурсів у більшості систем, оскільки читає лише один регістр.
У цьому симуляторі nop слугує роздільником або маркером під час експериментів. Крок через один просуває pc вперед на 4 і не змінює жодного регістра чи комірки пам'яті.
Розгортається до
addi zero, zero, 0
Асемблер замінює цю псевдоінструкцію реальною інструкцією або інструкціями, переліченими вище.
Приклад
li t0, 1 nop # advances one instruction, changes nothing addi t0, t0, 1 # t0 = 2
