Навигатор
Инструкции базового набора
RV32I:
арифметические
логические
сдвиги
сравнения
безусловные
переходы
системные
|
условные
переходы
загрузки
сохранения
См. также
|
|
Инструкция JALR
JALR rd, rs1, imm
Набор команд: базовый RV32I
Формат: J (иногда пишут UJ, подчеркивая общность с форматом U)
Операнды: rd и rs1 (base) – регистры, imm – 20-битная константа (со знаком!)
Действие: безусловный абсолютный переход по содержимому регистра (обеспечивает, в частности, возврат из подпрограммы): к базовому регистру rs1 прибавляется imm и происходит переход по вычисленному адресу (в документации подчеркнуто, что младший бит суммы игнорируется); в rd заносится адрес возврата, т.е. адрес следующей за JALR команды
Примечания
- JALR = Jump And Link Register; если команда JAL сохранила в регистре адрес возврата, то JALR позволяет по нему вернуться. Так стандартно обеспечивается возврат из подпрограмм. Впрочем, никто не запрещает программе сформировать содержимое rs1 иным образом. Например, можно занести в него некоторый фиксированный адрес (скажем, адрес начала стандартной подпрограммы в ПЗУ).
- Механизм обработки imm такой же, как у всех операций формата I. В этом смысле переход по JALR отличается от остальных переходов, например, BEQ.
- Как правило, imm=0, т.е. переход происходит на указанный в регистре адрес.
- Если формировать адрес возврата не требуется, то в качестве rd указывается
x0 .
Пример
Инструкция JALR x0, x1, 0 обеспечивает возврат из подпрограммы, вызванной ранее командой JAL x1, sub . Адрес возврата не сохраняется (rd = x0 ).
Код инструкции содержит следующие поля:
поле | разрядность | содержимое | примечание |
imm | 12 битов | 000000000000 | 0 |
rs1 | 5 битов | 00001 | x1 |
funct3 | 3 бита | 000 |
всегда |
rd | 5 битов | 00000 | x0 |
opcode | 7 битов | 1100111 |
всегда |
Итоговый код
000000000000 00001 000 00000 11001112 = 00 00 80 6716
|