jal

jal

Assembly RISC-V Riferimento

lyszt.net tratta jal e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

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

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