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