jal
lyszt.net obejmuje jal i inne instrukcje RISC-V w większych szczegółach.
Format kodowania
Opis
jal wywołuje funkcję. Funkcja to nazwany blok instrukcji, który może być uruchamiany z kilku miejsc i następnie powrócić, dzięki czemu logika jest zapisana raz i używana wszędzie. Wywołanie funkcji wymaga dwóch rzeczy. Program skacze do miejsca, w którym znajduje się funkcja, i pamięta, skąd przyszedł, aby później wrócić. jal robi jedno i drugie, a jego nazwa oznacza jump and link (skok i powiązanie).
Skok prowadzi do etykiety oznaczającej funkcję. Część związana z powiązaniem odbywa się przed skokiem. jal zapisuje adres następnej instrukcji, tej zaraz po wywołaniu, w rejestrze. Funkcja używa tego zapisanego adresu, aby powrócić.
Zgodnie z konwencją zapisany adres trafia do rejestru o nazwie ra, od return address (adres powrotu). Poniższa linia skacze do funkcji square i pozostawia w ra adres, do którego należy powrócić.
jal ra, square
Gdy funkcja się zakończy, wraca, skacząc pod adres w ra, co robi instrukcja ret. Zwykły skrót dla tego samego wywołania pokazano poniżej.
call square
Podręcznik RISC-V mówi, że przesunięcie skoku jest liczone w wielokrotnościach 2 bajtów, rozszerzane znakowo i dodawane do adresu instrukcji skoku. Daje to zakres plus minus 1 MiB, gdzie MiB to 1 048 576 bajtów. jal zapisuje adres następnej instrukcji, czyli pc plus 4, w rd. Standardowa konwencja wywołań w oprogramowaniu używa x1 jako rejestru adresu powrotu i x5 jako alternatywnego rejestru powiązania. Instrukcje skoku bezwarunkowego używają adresowania względem pc, co obsługuje kod niezależny od położenia, czyli kod działający wszędzie tam, gdzie zostanie załadowany do pamięci.
jal nadpisuje ra nowym adresem powrotu. Jeśli funkcja wywołuje inną funkcję, wewnętrzne wywołanie zastępuje zapisany adres zewnętrznego wywołania. Funkcja, która sama wykonuje wywołania, musi najpierw zapisać ra i przywrócić go przed powrotem. Przykład wywołuje square i pozostawia adres powrotu w ra.
Przykład
jal ra, square # call square; ra holds the return address
