[Assembly] Ciclo while in MIPS
Devo scrivere in assembler MIPS questo codice in C:
i e k corrispondono ai registri s3 e s5 e l'indirizzo base del vettore salva è in s6.
La soluzione del libro è questa:
La mia prima soluzione è questa:
La differenza è che ho usato solo un registro t0 senza usare t1: è giusto?
Poi ho cercato di ottimizzare il codice con questa seconda soluzione:
È giusta?
while (salva[i] == k) i+=1;
i e k corrispondono ai registri s3 e s5 e l'indirizzo base del vettore salva è in s6.
La soluzione del libro è questa:
Ciclo: sll $t1, $s3, 2 add $t1, $t1, $s6 lw $t0, 0($t1) bne $t0, $s5, Esci addi $s3, $s3, 1 j Ciclo Esci:
La mia prima soluzione è questa:
Ciclo: sll $t0, $s3, 2 add $t0, $t0, $s6 lw $t0, 0($t0) bne $t0, $s5, Esci addi $s3, $s3, 1 j Ciclo Esci:
La differenza è che ho usato solo un registro t0 senza usare t1: è giusto?
Poi ho cercato di ottimizzare il codice con questa seconda soluzione:
addi $t1, $s6, 0 Ciclo: lw $t0, 0($t1) bne $t0, $s5, Esci addi $s3, $s3, 1 addi $t1, $t1, 4 j Ciclo Esci:
È giusta?
Risposte
ma no fondamentalemnte la soluzione del libro è piu' leggibile, e forse la tua non è molto corretta, gira su spim la tua? alla prima iterata gira, alla seconda non sono cosi sicuro, in teoria sovrascrivi il riferimento al tuo vettore...pero' prova...
Nella seconda proposta che hai fatto dai una descrizione dell'uso dei registri perchè non è cosi chiaro
ciao ciao
Nella seconda proposta che hai fatto dai una descrizione dell'uso dei registri perchè non è cosi chiaro

ciao ciao
"frab":
la soluzione del libro è piu' leggibile
È più leggibile ma credo che usi inutilmente un registro in più: sovrascrivo l'indirizzo di salva con il contenuto di salva ma tanto l'indirizzo non mi serve più visto che a ogni ciclo lo ricalcolo da i e s6 (è diverso invece per la mia seconda soluzione dove calcolo il nuovo indirizzo sommando 4 a quello precedente).
"frab":
gira su spim la tua?
Non lo so, sto ancora studiando la teoria.
"frab":
Nella seconda proposta che hai fatto dai una descrizione dell'uso dei registri perchè non è cosi chiaro
In t1 c'è l'indirizzo di salva mentre in t0 c'è il contenuto di salva.
Quindi con la prima riga metto in t1 l'indirizzo iniziale di salva che è pari all'indirizzo di base del vettore visto che i=0.
Poi con il ciclo carico il contenuto di salva in t0.
Confronto salva e k, se sono diversi esco, altrimenti continuo:
aumento i di 1 e aumento l'indirizzo di 4 (visto che è pari a 4i + s6).
Ripeto il ciclo.
si in teoria funziona...quando lo testerai su SPIM, controlla che non ci siano sovrascritture strane
