Avrei da fare questo esercizio in Assembly del MIPS:
Scrivere una procedura (chiamata scarray) in assembly MIPS che prende in input un array di words e ritorna il punteggio totale dell'array. L'array è passato tramite l'indirizzo del primo elemento in $a0 e l'indirizzo dell'ultimo in $a1. Il punteggio totale deve essere ritornato in $v0 ed è la somma dei punteggi relativi agli elementi dell'array. Il punteggio di un elemento si ottiene chiamando la procedura score, passandogli in $a0 il valore dell'elemento, che ritorna in $v0 il punteggio dell'elemento. La procedura score non deve essere scritta, si assume che sia stata scritta da qualcun'altro (ad es. potrebbe far parte di una libreria). Si conosce solamente l'indirizzo, che è la label score, e si sa che la procedura rispetta le convenzioni MIPS per la chiamata di procedure.
ed io l'ho fatto in questo modo:
li $v0,0
subu $sp,$sp,12
sw $ra,12($sp) #salvo nello stack l'indirizzo di ritorno
WHILE: bge $a0,$a1,SCARRAY_END
sw $a0,8($sp) #salvo l'inidirizzo dell'elemento corrente dell'array
sw $v0,($sp) #salvo l'output
jal SCORE
lw $s0,($sp) #assegno ad $s0 l'output della procedura SCORE
lw $a0,8($sp) #recupero l'inidirizzo dell'elemento corrente dell'array
add $s0, $s0, $v0 #sommo a $s0 l'output di SCORE
move $v0,$s0 #assegno a $v0 il valore della precedente operazione
addi $a0,$a0,4 #passo all'elemento successivo dell'array
j WHILE
SCARRAY_END: lw $ra,12($sp)
addu $sp,$sp,12
jr $ra
ed io per testarla ho inserito il tutto sostituendo la chiamata all'ipotetica procedura SCORE con un contatore generico nel ciclo WHILE, in questo programma:
.data
dim: .word 4
v: .word 1,2,3,4
.text
la $a0,v
sll $a1,$a0,2
li $v0,0
jal SCARRAY
j END
SCARRAY:
li $v0,0
subu $sp,$sp,8
sw $ra,8($sp)
WHILE: bge $a0,$a1,SCARRAY_END
sw $a0, ($sp)
addi $v0,$v0,1
lw $a0, ($sp)
addi $a0,$a0,4
j WHILE
SCARRAY_END: lw $ra,8($sp)
addu $sp,$sp,8
jr $ra
END:
ma non funziona perchè va in loop nel WHILE, come mai??