jal
lyszt.net tratta jal e altre istruzioni RISC-V in modo più dettagliato.
Formato di codifica
Descrizione
jal chiama una funzione. Una funzione è un blocco denominato di istruzioni che può essere eseguito da più punti e poi ritornare, così la logica viene scritta una volta e usata ovunque. Chiamare una funzione richiede due cose. Il programma salta dove si trova la funzione e ricorda da dove è venuto per tornarci dopo. jal fa entrambe le cose, e il suo nome significa jump and link.
Il salto va a un'etichetta che contrassegna la funzione. La parte link avviene prima del salto. jal salva l'indirizzo dell'istruzione successiva, quella subito dopo la chiamata, in un registro. La funzione usa quell'indirizzo salvato per ritornare.
Per convenzione l'indirizzo salvato va in un registro chiamato ra, per return address. La riga sotto salta alla funzione square e lascia in ra l'indirizzo a cui ritornare.
jal ra, square
Quando la funzione termina, ritorna saltando all'indirizzo in ra, che è ciò che fa l'istruzione ret. La solita forma abbreviata per la stessa chiamata è mostrata sotto.
call square
Il manuale RISC-V dice che l'offset del salto è contato in multipli di 2 byte, esteso con segno e aggiunto all'indirizzo dell'istruzione di salto. Questo dà un intervallo di più o meno 1 MiB, dove un MiB è 1.048.576 byte. jal memorizza l'indirizzo dell'istruzione seguente, che è pc più 4, in rd. La convenzione di chiamata software standard usa x1 come registro dell'indirizzo di ritorno e x5 come registro di link alternativo. Le istruzioni di salto incondizionato usano l'indirizzamento relativo al pc, che supporta il codice indipendente dalla posizione, cioè codice che funziona ovunque venga caricato in memoria.
Un jal sovrascrive ra con un nuovo indirizzo di ritorno. Se una funzione ne chiama un'altra, la chiamata interna sostituisce l'indirizzo salvato di quella esterna. Una funzione che effettua chiamate proprie deve prima salvare ra e ripristinarlo prima di ritornare. L'esempio chiama square e lascia l'indirizzo di ritorno in ra.
Esempio
jal ra, square # call square; ra holds the return address
