Ciao a tutti, sto imparando il linguaggio assembler Mips e ho voluto cimentarmi con un esercizio. Calcola la somma degli elementi in un array. Ho scritto prima il codice C e poi volevo tradurlo in assembler Mips (senza il main, solo le procedure). Suppongo che l'array sia già da qualche parte e anche la sua dimensione. Vi posto il codice:
Codice C =
http://pastebin.com/x2z6MQ1
Immagino che:
A: .word {7,3,1,4,5} # Questo è il mio Array A di 5 elementi.
$a0 # Registro che contiene la dimensione di A.
$a1 # Registro che punta all'indirizzo base del vettore A.
$v0 # Registro che conterrà il risultato della somma.
Queste sono le procedure:
somma: add $t3 , $a1 , $zero # t3 punta allo stesso indirizzo di memoria di a1.
add $t1 , $zero , $zero # t1 = 0 ( la variabile "i" nel codice C).
loop: slt $t2 , $t1 , $a0 # if (i < n) t2 = 1, else t2 = 0.
bne $t2 , 1 , EXIT # if (t2 è diverso da 1) vai all'etichetta EXIT.
lw $t4 , 0($t3) # Carico nel registro t4 il primo elemento di A cioè 5.
add $v0 , $v0 , $t4 # v0 = 0 + 5.
sll $t3 , $t3 , 2 # t3 punta all'indirizzo di mememoria successivo (2° elemento di A).
addi $t1 , $t1 , 1 # i = i + 1
j loop
EXIT: Qui devo printare il risultato?
Ho scritto in t3 lo stesso indirizzo di a1 perchè ho pensato che per scorrere il vettore bastava solamente cambiare l'offset , dell'istruzione lw $t4 , 0($t3) , di 4 in 4 . Ma visto che nel loop non posso cambiarlo di volta in volta, allora cambio il registro base (lo faccio puntare all'elemento in questione), così che l'offset rimanga sempre 0.
C'è qualcosa di sbagliato? Funziona?
Grazie delle eventuali risposte.