Instrucciones de transferencia de datos en el Mips
Las instrucciones de transferencia de datos en el MIPS cargan, almacenan y mueven datos entre registros y memoria. Si bien la arquitectura MIPS está orientada al uso de registros, también se debe tener la posibilidad de trabajar con la información almacenada, o por almacenar, en la memoria.
Estos datos recopilados pueden representar direcciones, palabras o simplemente valores constantes. Normalmente, las instrucciones de transferencia de datos se usan para crear estructuras de datos en la memoria, tales como arreglos lineales, matrices y listas que no pueden ser representados usando solo registros. Cabe destacar que las instrucciones de transferencia son las únicas que pueden acceder a la memoria del sistema.
Todas las instrucciones de transferencia de datos usan el formato de instrucción Inmediato:
Opcode | rs | rt | inmmediate |
---|
Este formato es idóneo para las instrucciones de transferencia de datos y cada bloque tiene un significado:
Opcode: Código de la operación que se realizará.
rs: Registro que contiene la posición de memoria a utilizar.
rd: Registro al que se le almacenará la información o que contiene la información por guardar.
inmediate: Una constante usada como “offset” con respecto a la memoria base en rs. Cabe destacar que la constante tiene signo.
Contenido
Instrucciones De Carga
Cargar dirección (la)
Cargar palabra (lw)
Cargar media palabra (lh)
Cargar inmediato (li)
Cargar el Inmediato Superior (lui)
lui $t1, Const
Coloca el valor de la constante Const de 16bits en los 16bits mas significativos de $t1 y los otros 16bits menos significativos son llenados con ceros. Los nombres de los regitros son solo de referencia, otros pueden ser usados.
Instrucciones De Almacenamiento
Almacenamiento de Media Palabra (sh)
sh $t1, Const($t2)
La instrucción toma los 16bits menos significativos de $t1 y los guarda en la posicion de memoria apuntada por $t2 + la constante opcional agregada (No en $t2 propiamente). Los nombres de los registros son solo de referencia, otros pueden ser usados.
Almacenamiento de un Byte (sb)
sb $t1, Const($t2)
Muy similar a la anterior, salvo que funciona solo con el byte menos significativo y no con 2 bytes. La instrucción toma los 8bits menos significativos de $t1 y los guarda en la posicion de memoria apuntada por $t2 + la constante opciona agregada (No en $t2 propiamente). Los nombres de los registros son solo de referencia, otros pueden ser usados.
Instrucciones Mixtas
Mover desde High (mfhi)
mfhi $t1
Mueve el valor guardado en el registro HIGH (hi) al registro que se le indica $t1. Es particularmente util para extraer información luego de operaciones como multiplicación y división. Los nombres de los regitros son solo de referencia, otros pueden ser usados.
Mover desde Low (mflo)
mflo $t1
Mueve el valor guardado en el registro LOW (lo) al registro que se le indica $t1. Es particularmente util para extraer información luego de operaciones como multiplicación y división. Los nombres de los regitros son solo de referencia, otros pueden ser usados.
Instrucciones Especiales
El par dual "Load Linked & Store Conditional"
El par de instrucciones Load Linked & Store conditional fueron creados para adaptar los estándares de carga y almacenamiento de datos, Load Word y Save Word, a computadores con múltiples procesadores. Al tener la posibilidad de tener muchos procesos ejecutándose en paralelo a la vez, ¿qué pasa si al menos 1 procesador trata de adquirir la información y al menos otro procesador trata de escribirla? En ese caso, el orden de dichas operaciones cambia el resultado final, y puede traer inconvenientes.
Las instrucciones Load Linked y Store conditional lidian con éste tipo de problemas. Tanto Load Linked como Store conditional tienen la misma sintáxis de Load y Save, sin embargo hay una cierta variación. La instrucción Load Linked realiza la misma operación, carga la información de una memoria en un registro. Sin embargo, es necesaria para poder usar el Store Conditional.
Por otra parte, la instrucción Store conditional salva el valor de un registro en la MISMA POSICION DE MEMORIA usada previamente y, además, cambia el valor del segundo registro a “1” o “0” dependiendo si el store conditional falla o no. La condición para que la instrucción falle, se da si el valor de la posición de memoria usada en el Load Linked cambia antes de que se use el Store Conditional, en cuyo caso el registro toma el valor “0”.
De ésta manera, si el computador falla al realizar una tarea de transferencia de datos, al nivel de procesos paralelos, haciendo una prueba en el registro usado por el store conditional se puede notar dicho error, y corregirlo a tiempo, por eso dichas instrucciones deben ir contiguas. Un ejemplo de la implementación:
Ejemplo:
try: add $t0,$zero,$s4 #copy exchange value
ll $t1,0($s1) #load linked
sc $t0,0($s1) #store conditional
beq $t0,$zero,try #branch store fails
add $s4,$zero,$t1 #put load value in $s4
Notas
- Para la transferencia de datos se usa la convención del uso de registros del MIPS, por ende para trabajar la transferencia de datos se suelen usar los registros temporales (t0-t9)
- Se recuerda que, al trabajar con estructuras de datos, se deben escalar los offsets por el número de bytes del tamaño dado de los datos usados. Ejemplo: cuando se usan estructuras para almacenar Words(4 bytes) se multiplica el offset por 4.
- Las instrucciones Load Linked & Store conditional deberían ir seguidas.
- Las instrucciones Load Linked & Store conditional cargan y almacenan información necesariamente en la misma posición de memoria.
Contributors
Anny, Carlosrodrif, Ddtdanilo, GMarzinotto, JCaceres, JJPerez