Estoy estudiando el lenguaje ensamblador MIPS y encontré este ejemplo en el libro y para mí parece incorrecto. Si es así, no sería el primer error que encontré en este libro.Convertir C a MIPS - Matrices anidadas
Las variables f
y g
registros son asignados $s0
y $s1
respectivamente, las direcciones de base para las matrices A
y B
son $s6
y $s7
respectivamente.
El ejemplo de código C es:
f = g - A[B[4]];
y el conjunto del MIPS correspondiente proporcionada es:
lw $t0, 16($s7)
lw $s0, 0($t0)
sub $s0, $s1, $s0
Desde mi comprensión de lo anterior código MIPS sería cargar algunos datos aleatorios de la memoria en la dirección proporcionada por $t0
y luego restarlo de $s1
y no acceder al índice $t0
de la matriz indicada en $s6
.
El ensamblador del MIPS correcta desde mi entendimiento sería lo largo de las líneas de:
lw $t0, 4($s7)
add $t0, $t0, $s6
sll $t0, $t0, 2
lw $s0, 0($t0)
sub $s0, $s1, $s0
estoy en lo cierto que se trata de un error en el libro o estoy mal entendido algo.
Editar: Se ha corregido un error en el código MIPS corregido como se ha señalado por Chris Dodd
Creo que estás en lo correcto. ¡Bien hecho! – davin
Tu explicación es excelente. La mayor prueba del hecho de que ese código no está haciendo lo que se supone que es, es que no se menciona nada de '$ s6', por lo que no hay manera de que pueda recuperar un elemento de la matriz' A'. – davin
Suponiendo que la matriz A tiene 4 bytes por elemento (como parece ser la matriz B, está utilizando un desplazamiento de 16 para obtener el elemento 4 y usando las instrucciones lw para obtener 4 bytes), deberá agregar un multiplicar por 4 aquí también (o un cambio equivalente por 2) –