nopпсевдо

nop

псевдо
RISC-V Ассемблер Ссылка

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