jrпсевдо

jr

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

lyszt.net охватывает jr и другие инструкции RISC-V более подробно.

Описание

jr выполняет переход по адресу, хранящемуся в регистре. Название означает jump register (переход по регистру). j выполняет переход на фиксированную метку, записанную в коде. jr выполняет переход по любому адресу, который хранит регистр и который программа вычисляет во время выполнения. Он не сохраняет адрес возврата.

jr — это псевдоинструкция для строки ниже, регистрового перехода, который отбрасывает адрес возврата (см. jalr).

jalr zero, rs, 0

Таблица переходов — это массив в памяти, который хранит адреса нескольких процедур, и jr используется вместе с ней. Чтобы выбрать процедуру номер i, программа вычисляет её ячейку в таблице, загружает хранящийся там адрес в регистр и использует jr для перехода по нему. Один поиск и один переход заменяют длинную серию сравнений (это случай 0, случай 1, случай 2 и так далее), независимо от числа случаев. Плотные операторы switch и внутренний цикл интерпретатора выполняют диспетчеризацию именно так.

Руководство RISC-V кодирует обычные безусловные косвенные переходы как jalr с rd, установленным в x0. Оно отмечает, что jalr не рассматривает свой непосредственный операнд как кратное 2 байтам, в отличие от условных переходов, и что в большинстве случаев использования jalr непосредственный операнд равен нулю или следует после lui либо auipc.

Возврат из функции — это переход по адресу в ra, поэтому ret — это jr ra под другим именем. Группа инструкций перехода различается тем, откуда берётся адрес и сохраняется ли адрес возврата.

Разворачивается в

jalr zero, rs, 0

Ассемблер заменяет эту псевдоинструкцию реальной инструкцией или инструкциями, перечисленными выше.

Пример

la t0, target
jr t0            # jump to the address held in t0