jalr
lyszt.net obejmuje jalr i inne instrukcje RISC-V w większych szczegółach.
Format kodowania
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
Odwołania
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.1, Unconditional Jumps, page 30.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.1, Integer Register-Immediate Instructions, pages 28 to 29.
