¿Cómo funcionan las instrucciones Store Word (SW) y Load Word (LW), MIPS?

1

Las instrucciones SW y LW se definen como:

     sw $t, offset($s)  : 1010 11ss ssst tttt iiii iiii iiii iiii
     lw $t, offset($s)  : 1000 11ss ssst tttt iiii iiii iiii iiii

SW realiza la operación MEM [$ s + offset] = $ t, pero en la ruta de datos parece que ha realizado la operación MEM [Data ($ s) + offset] = $ t, porque en lugar de tomar el valor $ s como entrada en la ALU que tomó en los datos almacenados en $ s.

LW realiza la operación $ t = MEM [$ s + offset], pero al observar la ruta de datos parece que está ejecutando $ t = MEM [Datos ($ s) + offset].

Otra cosa que no entiendo es por qué usamos la extensión de signo en lugar de simplemente mover el signo al bit 32 y rellenar el resto de los datos con ceros. Si ha definido un desplazamiento es

0x8fff: 1000 1111 1111 1111

será un signo extendido a 0xffff8fff: 1111 1111 1111 1111 1000 1111 1111 1111, que es un número completamente diferente del desplazamiento, el número que realmente necesitamos es 0x80008ffff.

    
pregunta KillaKem

1 respuesta

3

$s y $t son especificadores de registro. Su interpretación MEM[RegisterData(s) + offset] es básicamente correcta. $s significa, esencialmente, "obtener los datos del número de registro s en el archivo de registro". Entonces, si s en la instrucción es el patrón de bits 10001 , entonces $s significa: lea el valor fuera del registro 17, agregue los bits de desplazamiento extendido por signo (los 16 bits representados por i en la codificación) , y usar eso como la dirección para acceder a la memoria. De manera similar para el $t en la instrucción lw . Significa volver a escribir los datos en el registro numerado t .

Su pregunta sobre la extensión del signo: busque complemento de dos . El número de complemento de los dos bits de 16 0000 1111 1111 1111 es decimal +4095. El número de complemento de los dos bits de 16 1000 1111 1111 1111 es decimal -28673. El número de complemento de 32 bits dos 0xffff8fff también es -28673. El número de complemento de 32 bits dos 0x80008fff es decimal -2147446785, que claramente no es lo que quieres.

    
respondido por el Wandering Logic

Lea otras preguntas en las etiquetas