implementando el modo de direccionamiento directo para una instrucción de carga en una arquitectura mips

Dada una máquina Mips con direcciones de 26 bits y rutas de datos de 32 bits, donde la instrucción de carga es la siguiente

|Código OPT|rs|rd|inmediato|

|6 bits |5 bits|5 bits|16 bits|

El código OPT es el tipo de instrucción (lw), rd es donde se cargará el valor, rs es el registro base e inmediato es el desplazamiento. Mips admite solo el modo de desplazamiento, lo que significa:

 lw $t9, ($t7)60

es lo mismo que

 Reg[$t9]<-M[Reg[$t7]+60]

Esta es una carga típica de mips, pero ¿qué pasaría si quisiera implementar la carga indirecta de dirección en la unidad de control, escribiendo las construcciones erróneas para el modo indirecto de dirección similar a una computadora cisc básica? Donde la dirección del valor está en la memoria. ¿Es posible hacerlo en una sola instrucción?

Editar:

Esto es lo que estoy buscando en una instrucción:

Reg[$t9]<-M[Addrs]

o mejor aún

Reg[$t9]<-M[M[Addrs]]
No estoy seguro de seguirte del todo. ¿Puedes escribir una pseudo-instrucción para demostrar lo que quieres decir? ¿ Es eso Reg[$t9]<-M[addr]lo que buscas?
sí, esto es exactamente lo que busco

Respuestas (1)

No como una sola instrucción, no. Básicamente porque MIPS, como instrucción de 32 bits, no tiene espacio para contener un código de operación, un registro de destino y una dirección de 32 bits.

Aunque su sistema específico puede tener solo 26 líneas de dirección física, internamente sigue siendo un esquema de direccionamiento de 32 bits. Esas 26 líneas de dirección pueden representar los 26 bits más bajos de una dirección de 32 bits, o pueden asignarse a diferentes áreas del espacio de direcciones de 4GiB a través de una MMU de alguna forma.

Para cargar un valor de una dirección en un registro, primero debe cargar la ubicación en un registro y luego cargar el valor de la memoria en relación con ese registro.

Si el valor que desea se encuentra dentro de los primeros 32768 bytes del espacio de direcciones, puede acceder a él en relación con el registro cero (se firma un desplazamiento, por lo que solo 15 bits son válidos para la parte más baja de la memoria) . Un desplazamiento negativo desde cero le daría acceso a los 32767 bytes superiores del espacio de memoria (32 bits).

El objetivo de RISC a diferencia de CISC es que tiene algunas instrucciones muy básicas que encadena para hacer lo que quiere, en lugar de una sola instrucción que hace todo por usted. En RISC hay muy pocas instrucciones que toman más de un ciclo de reloj para ejecutarse (solo las instrucciones de bifurcación son realmente más largas), mientras que en CISC las instrucciones pueden tomar muchos más ciclos para ejecutarse. En RISC, usa solo los ciclos de reloj que necesita para esa tarea específica, y no desperdicia ciclos de reloj en instrucciones de longitud extendida que hacen lo que quiere, además de otras cosas que podrían ser útiles en otras situaciones.

Además, RISC permite una mejor multitarea, ya que cada instrucción generalmente es solo un ciclo, por lo que las interrupciones pueden ocurrir más rápido. Con CISC, si una instrucción tarda, digamos, 20 ciclos en ejecutarse, el sistema no puede ejecutar una interrupción hasta que finalice esa instrucción.

Para la canalización clásica de 5 etapas, las cargas toman dos ciclos (el MIPS R2000 en realidad tenía una ranura de retraso de carga). Un procesador puede iniciar una interrupción antes de que se haya completado una instrucción anterior; esto es más fácil si se puede determinar temprano si la instrucción genera (o es probable que genere) una excepción (por ejemplo, MIPS R4000 tenía una detección de excepción conservadora de FP antes de la etapa de reescritura de la canalización de enteros, lo que simplifica las excepciones precisas). Sin embargo, también es posible especular que no ocurrirá una excepción. Incluso los RISC pueden optar por no detenerse en caso de pérdida de carga. (+1 por casi toda la razón)