jalr

jalr

Asembler RISC-V Referencja

lyszt.net obejmuje jalr i inne instrukcje RISC-V w większych szczegółach.

Format kodowania

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Opis

jalr należy do tej samej rodziny co jal, gdzie r oznacza rejestr. Obie instrukcje wykonują skok i zapisują adres powrotu, zgodnie z opisem na stronie jal. Różnica dotyczy celu skoku. jal skacze do etykiety ustalonej w momencie pisania programu, natomiast jalr skacze do adresu przechowywanego w rejestrze, co pozwala obliczyć cel w czasie wykonania.

To właśnie umożliwia powrót z funkcji. Wywołujący umieszcza adres powrotu w rejestrze ra, a funkcja wraca, używając jalr, aby dotrzeć do adresu w ra. Instrukcja ret to jalr do ra.

Ta sama możliwość ma zastosowanie, gdy cel nie jest znany z góry. Obejmuje wywołania funkcji, której adres został przekazany, oraz wybór spośród procedur wymienionych w tablicy adresów, co jest sposobem realizacji dużego wyrażenia switch lub dyspozytora interpretera.

Zgodnie z podręcznikiem RISC-V, jalr dodaje rozszerzony znakowo 12-bitowy immediate do rejestru rs1, a następnie zeruje najmniej znaczący bit wyniku. Zapisuje adres następnej instrukcji, pc plus 4, w rd, a x0 może służyć jako cel, gdy adres powrotu nie jest potrzebny. lui po którym następuje jalr, osiąga dowolny 32-bitowy adres absolutny, a auipc po którym następuje jalr, osiąga dowolny 32-bitowy adres względny wobec pc. Obie instrukcje skoku zgłaszają wyjątek, jeśli adres docelowy nie jest wyrównany do granicy czterech bajtów.

Format jalr przedstawiono poniżej. Skacze do adresu w rejestrze rs plus opcjonalny mały offset i zapisuje adres powrotu w rd.

jalr rd, rs, offset

Podobnie jak w przypadku jal, zapisywany rejestr jest nadpisywany, więc ta sama ostrożność dotycząca zachowania ra ma zastosowanie.

Przykład

la t0, target
jalr ra, t0, 0   # jump to target; ra holds the return address