Ciao
ah finalmente qualche d'uno che è interessato alla teoria e non deve risolvere problemi ben specifici.
allora veniamo alla prima domanda
il tuo modo di utilizzare i registri non è sbagliato, anzi e prassi comune.
però dipende dal programma che devi fare perchè se il dato che utilizzi deve essere conservato "salvato" ti conviene lavorare direttamente sui registri di tipo $s risparmiando codice di passaggio tra registri.
poi ci sono registri dedicati quali ad esempio i registri $a, specifici per input, e $v, specifici per l'output, i quali svolgono compiti ben prestabbiliti e quindi utilizzati solo quando servono.
per esempio per le syscall
il registro $v0 serve per fissare la modalità di chiamata
mentre il registro $a0 conterrà il parametro indispensabile alla syscall.
esempio
li $v0, 4 # chiama modalità di stampa
la $a0, scelta # parametro alias stringa da stampare.
syscall #richiama la funzione in questo caso di stampa.
poi oltre quelli che hai citato tu ci sono anche altri registri che hanno compiti ben specifici e che se non servono e meglio non utilizzare.
questi sono:
$ra serve per poter ritornare da una subroutine
$gp contiene l'indirizzo di partenza della programma global area
$sp stack pointer
$fp frame pointer serve per memorizzare i parametri da passare ad una subroutine.
$k.. riservati al sistema operativo
$at riservato all'assembler e usato per settare opzioni di compilazione e ottimizzazioni.
per il momento ho finito con la prima domanda naturalmente se non hai compreso qualcosa o hai dei dubbi chiedi pure.
veniamo alla 2 domanda
tu lo stack pointer non lo devi usare ma devi usare il frame point.
lo stack lo gestisce automaticamente il sistema mentre il frame point molto simile allo stack
te lo crei e te lo gestisci tu.
il frame point come tu ben sai serve per passare i parametri un esempio di scopo potrebbe essere il seguente.
date 2 date trovare quanti giorni e quante settimane sono trascorsi tra le 2 date
adesso per risolvere il problema devi accettare 2 date
quindi una routine accetterà le 2 date
che poi saranno passate ad un altra routine che farà i calcoli
e poi la routine chiamante stamperà i dati e magari chiederà se si vuole terminare o ricominciare.
a questo punto sorge spontanea una domanda quando devo usare il frame point ?
si utilizza nei seguenti casi:
1) quando ci è espressamente richiesto
2) quando si ha un numero eccessivo di parametri di solito parametri >2
3) quando i dati da passare devono essere preservati perchè o si utilizzano parecchi registri all'interno della subroutine o perchè servono in fase conclusiva.
4) se si vuol dare chiarezza al programma e quindi dividerlo in più parti
5) quando i dati i parametri servono a più routine diverse.
6) quando i dati da restituire sono più di 2.
quando non usare il frame point.
1)quando la routine e unica
2)quando i parametri da passare sono <=2
3) quando i dati da restituire sono <=2 e i parametri di input <=2
4) quando ci sono risorse libere e non ci interessa usarle.
ti ho elencato quando serve il frame point e quando non serve.
spero di esserti stato di aiuto e se hai qualche domanda chiedi pure.