jr
pseudolyszt.net obejmuje jr i inne instrukcje RISC-V w większych szczegółach.
Opis
jr skacze pod adres przechowywany w rejestrze. Nazwa oznacza jump register (skok do rejestru). j skacze pod stałą etykietę zapisaną w kodzie. jr skacze pod dowolny adres, który przechowuje rejestr, wyznaczony przez program w trakcie działania. Nie zapisuje adresu powrotu.
jr to pseudoinstrukcja dla poniższej linii, skoku rejestrowego, który odrzuca adres powrotu (zobacz jalr).
jalr zero, rs, 0
Tablica skoków to tablica w pamięci przechowująca adresy kilku procedur, a jr jest z nią używane. Aby wybrać procedurę numer i, program oblicza jej miejsce w tablicy, ładuje przechowywany tam adres do rejestru i używa jr, aby pod niego skoczyć. Jedno wyszukanie i jeden skok zastępują długi ciąg porównań (czy to przypadek 0, przypadek 1, przypadek 2 i tak dalej), niezależnie od liczby przypadków. Gęste instrukcje switch i wewnętrzna pętla interpretera działają w ten sposób.
Podręcznik RISC-V koduje zwykłe bezwarunkowe skoki pośrednie jako jalr z rd ustawionym na x0. Zauważa, że jalr nie traktuje swojego argumentu natychmiastowego jako wielokrotności 2 bajtów, w przeciwieństwie do rozgałęzień warunkowych, oraz że większość użyć jalr ma zerowy argument natychmiastowy lub występuje po lui albo auipc.
Powrót z funkcji to skok pod adres w ra, więc ret to jr ra pod inną nazwą. Grupa instrukcji skoku różni się tym, skąd pochodzi adres i czy zapisywany jest adres powrotu.
Rozwija się do
jalr zero, rs, 0
Asembler zastępuje tę pseudoinstrukcję rzeczywistą instrukcją lub instrukcjami wymienionymi powyżej.
Przykład
la t0, target jr t0 # jump to the address held in t0
