retpseudo

ret

pseudo
Assembly RISC-V Riferimento

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

Descrizione

ret ritorna da una funzione e restituisce il controllo al chiamante. Un call ne attende uno. Quando una funzione viene chiamata, il chiamante inserisce un indirizzo di ritorno nel registro ra (vedi call e jal), e ret salta a quell'indirizzo, che continua subito dopo la chiamata originale. È una pseudoistruzione che salta a ra.

ret funziona solo quando ra contiene ancora l'indirizzo corretto. In una funzione che non chiama nient'altro, nulla modifica ra tra l'ingresso e l'uscita. Un call all'interno della funzione sovrascrive ra con un nuovo indirizzo di ritorno e cancella quello di cui la funzione ha bisogno. Una funzione che ne chiama altre salva il proprio ra all'ingresso e lo ripristina prima di ret. Senza il ripristino, la funzione ritorna nel posto sbagliato, e il programma salta in codice non correlato o entra in un ciclo infinito.

Per convenzione una funzione mette il proprio risultato nel registro a0 prima di ritornare, e il chiamante lo legge lì.

Il manuale RISC-V afferma che un ritorno di procedura nella convenzione di chiamata standard è codificato come un jalr con rd=x0, rs1=x1 e un immediato di 0. Salta all'indirizzo in x1 e non scrive alcun indirizzo di collegamento, poiché x0 lo scarta. Il manuale aggiunge che i processori usano i numeri di registro in jal e jalr come suggerimenti per prevedere i ritorni di funzione, il che è una delle ragioni per cui la convenzione standard mantiene l'indirizzo di ritorno in x1.

L'esempio è la funzione completa più semplice. square moltiplica il proprio argomento per se stesso e ret restituisce il risultato. Non chiama nient'altro, quindi non salva e non ripristina nulla. Eseguirla nel simulatore mostra il controllo che salta indietro al chiamante.

Si espande in

jalr zero, ra, 0

L'assembler sostituisce questa pseudoistruzione con la o le istruzioni reali elencate sopra.

Esempio

square:
  mul a0, a0, a0
  ret              # return to the caller