Sto studiando il linguaggio dell'assemblaggio MIPS e ho trovato questo esempio nel libro e per me sembra scorretto. Se è così non sarebbe il primo errore che ho trovato in questo libro.Converti C in MIPS - Matrici annidate
Le variabili f
e g
registri sono assegnati $s0
e $s1
rispettivamente, gli indirizzi di base per le matrici A
e B
sono $s6
e $s7
rispettivamente.
L'esempio di codice c è:
f = g - A[B[4]];
E il corrispondente complesso di MIPS fornite sono:
lw $t0, 16($s7)
lw $s0, 0($t0)
sub $s0, $s1, $s0
Dalla mia comprensione del codice sopra MIPS sarebbe caricare alcuni dati casuali dalla memoria all'indirizzo fornito per $t0
e quindi sottrarre da $s1
e non accedere all'indice $t0
dell'array denotato in $s6
.
L'assemblea MIPS corretta dalla mia comprensione sarebbe lungo le linee di:
lw $t0, 4($s7)
add $t0, $t0, $s6
sll $t0, $t0, 2
lw $s0, 0($t0)
sub $s0, $s1, $s0
ho ragione che si tratta di un errore nel libro o sto malinteso qualcosa.
Edit: Corretto un errore nel codice MIPS corretto come sottolineato da Chris Dodd
Penso che tu abbia ragione. Molto bene! – davin
La tua spiegazione è eccellente. La più grande prova del fatto che quel codice non sta facendo quello che dovrebbe, è che non si fa menzione di '$ s6', quindi non c'è modo di recuperare un elemento dall'array' A'. – davin
Supponendo che l'array A sia 4 byte per elemento (come sembra essere l'array B - stai usando un offset di 16 per ottenere l'elemento 4, e usando le istruzioni di lw per ottenere 4 byte), dovrai aggiungere un moltiplicare per 4 anche qui (o uno spostamento equivalente di 2) –