jalr

jalr

Assembly RISC-V Riferimento

lyszt.net tratta jalr 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

jalr appartiene alla stessa famiglia di jal, con la r che sta per registro. Entrambe le istruzioni saltano e memorizzano un indirizzo di ritorno, come descritto nella pagina jal. La differenza è la destinazione del salto. jal salta a un'etichetta fissata quando il programma viene scritto, mentre jalr salta a un indirizzo contenuto in un registro, il che consente di calcolare la destinazione in fase di esecuzione.

Questo è ciò che consente a una funzione di ritornare. Il chiamante inserisce un indirizzo di ritorno nel registro ra, e la funzione ritorna usando jalr per raggiungere l'indirizzo in ra. L'istruzione ret è un jalr verso ra.

La stessa capacità si applica ogni volta che la destinazione è sconosciuta in anticipo. Copre le chiamate a una funzione il cui indirizzo è stato passato, e la selezione tra routine elencate in una tabella di indirizzi, che è il modo in cui una grande istruzione switch o un interprete effettua il dispatch.

Secondo il manuale RISC-V, jalr aggiunge l'immediato a 12 bit con estensione del segno al registro rs1, quindi cancella il bit meno significativo del risultato. Memorizza l'indirizzo dell'istruzione successiva, pc più 4, in rd, e x0 può servire come destinazione quando non è necessario un indirizzo di ritorno. Un lui seguito da jalr raggiunge qualsiasi indirizzo assoluto a 32 bit, e un auipc seguito da jalr raggiunge qualsiasi indirizzo relativo al pc a 32 bit. Entrambe le istruzioni di salto sollevano un'eccezione se l'indirizzo di destinazione non è allineato a un confine di quattro byte.

Il formato di jalr appare di seguito. Salta all'indirizzo nel registro rs più un piccolo offset opzionale, e memorizza l'indirizzo di ritorno in rd.

jalr rd, rs, offset

Come con jal, il registro che scrive viene sovrascritto, quindi vale la stessa attenzione nel preservare ra.

Esempio

la t0, target
jalr ra, t0, 0   # jump to target; ra holds the return address