Una funzione di codice è un frammento di codice che riceve degli argomenti e calcola un risultato, è utile per rendere il codice riusabile e modulare.

Le funzioni hanno:

  • un indirizzo di partenza delle istruzioni,
  • degli argomenti,
  • la porzione di codice che esegue il calcolo
  • un risultato.

Cosa succede quando si chiama una funzione

La funzione chiamante (anche il Main) esegue una procedura precisa per chiamare una funzione:

  • Prepara gli argomenti (a0–a7)
  • Salva i temporanei (t0–t6) se servono dopo
  • Chiama la funzione con call
  • Recupera il risultato da a0

La funzione chiamata:

  • Salva ra (Return Address) (se chiamerà altre funzioni)
  • Salva fp (Frame Pointer) e registra i callee-saved (s0–s11) se usati
  • Alloca lo stack frame se necessario
  • Esegue il corpo
  • Scrive il risultato in a0
  • Ripristina stack, fp, ra, registri
  • Ritorna con ret

Come chiamare e gestire una funzione

Passaggio di argomenti

Usa le istruzioni di load (in base alla dimensione di dati: word, half word, byte + versioni unsigned, etc…) per caricare gli argomenti in a0a7.

Chiamata

jal etichettaFunzione # Salta alla funzione e salva il PC in ra

Al posto di jal si può usare anche call che è identica.

Ritorno alla funzione chiamante

jalr x0, 0(ra)     # Salta all'indirizzo salvato in ra

Oppure

ret                # Pseudoistruzione per `jalr x0, 0(ra)`