callpseudo

call

pseudo
Assembly RISC-V Riferimento

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

Descrizione

call esegue una funzione e gestisce il ritorno. Salta alla funzione e memorizza l'indirizzo di ritorno in ra, il che consente alla funzione di tornare. È una pseudoistruzione che di solito si espande nell'istruzione sottostante.

jal ra, label

Quando una funzione si trova troppo lontano perché un singolo salto possa raggiungerla, l'assembler sostituisce una sequenza più lunga che copre la distanza. Scrivere call con il nome della funzione dichiara l'intento e lascia la scelta della forma all'assembler. La voce jal descrive il salto e il salvataggio dell'indirizzo di ritorno. La riga sottostante chiama la funzione square.

call square

Chiamare una funzione richiede anche un accordo su come le informazioni passano tra chiamante e chiamato. Tale accordo è la convenzione di chiamata. Il chiamante mette gli input della funzione nei registri degli argomenti, denominati a0, a1 e così via, e legge il risultato da a0 una volta che la funzione ritorna. Entrambe le parti seguono la stessa regola, quindi codice scritto separatamente funziona comunque insieme.

Ogni call sovrascrive ra. Una funzione che effettua chiamate proprie salva il ra che ha ricevuto prima di effettuarle, poi ripristina quel valore prima del proprio ritorno. Senza questo, l'indirizzo di ritorno della chiamata interna sostituisce quello della chiamata esterna e la funzione non riesce a tornare. Una funzione che non chiama nient'altro non ha bisogno di salvare ra.

Il manuale RISC-V afferma che la convenzione di chiamata software standard usa x1 come registro dell'indirizzo di ritorno. Un jal raggiunge destinazioni entro più o meno 1 MiB, dove un MiB è 1.048.576 byte. Una destinazione più lontana richiede un auipc seguito da jalr, che raggiunge qualsiasi punto in un intervallo di indirizzi relativi al pc a 32 bit.

L'esempio chiama square con 6 in a0 e trova 36 in a0 in seguito. L'argomento entra e il risultato esce attraverso la convenzione.

Si espande in

jal ra, label

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

Esempio

call square      # jumps to square; ra holds the return address