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
