Instrucciones de transferencia de datos en el Mips

De Wikitronica
Saltar a: navegación, buscar

Las instrucciones de transferencia de datos en el MIPS cargan, almacenan y mueven datos entre registros y memoria; no confundir con las Instrucciones aritméticas, lógicas y de salto incondicional en el Mips. 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:

Format I
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.

Instrucciones De Carga

Cargar dirección (la)

La instrucción load adress tiene diversas presentaciones que permiten cargar en un registro el contenido de otro o la dirección de una etiqueta con o sin un offset dado por una constante "Const" de hasta 32 bits (o por otro registro, en el caso de la etiqueta). Además, esta instrucción permite cargar operandos inmediatos de 16 (con signo extendido o 0 extendido) o de 32 bits.

#Los datos se cargan en $t1 en este caso, pero puede usar los que prefiera

# Para cargar el registro sin offset no se coloca ninguna constante
la $t1, Const($t2)

# Para operandos inmediatos
la $t1,Inmediato

#Para etiquetas. Si no se quiere el offset de Const + $t2, quitar alguna de las dos o ambas.
#Si sólo se quiere el offset dado por $t2 no colocar el signo +

la $t1, etiqueta+Const($t2)

Cargar palabra (lw)

La instrucción load word, de manera similar a load adress, permite cargar en un registro la palabra almacenada en la dirección de memoria determinada por el segundo operando colocado, que puede ser un valor inmediato, una etiqueta o un registro con o sin offset dado por la constante "Const" de hasta 32 bits.

#Los datos se cargan en $t1 en este caso, pero puede usar los que prefiera

# No colocar ninguna constante si no se quiere offset (Const=1)
lw $t1, Const($t2)

# Para operando inmediatos
lw $t1,Inmediato

#Para etiquetas. Si no se quiere el offset de Const + $t2 (Const($t2)), se puede quitar y dejar sólo etiqueta.
#Si sólo se quiere el offset dado por $t2 no colocar el signo + (lw $t1,etiqueta($t2))

lw $t1, etiqueta+Const($t2)

Cargar media palabra (lh)

Funciona de manera muy simular a cargar palabra pero, en este caso, se carga la media palabra de 16 bits, con signo extendido, de la dirección de memoria dada por el segundo operando. La sintaxis de esta instrucción es igual a la forma vista en el apartado anterior, sólo se debe sustituir lw por lh.

Cargar byte (lb)

Load byte permite cargar un valor de ocho bits con signo extendido de la dirección de memoria determinada por el segundo operando, de manera similar load adress. La sintaxis de esta instrucción es igual a la de load adress o load word, sólo se debe sustituir la o lw por lb

Cargar inmediato (li)

Como su nombre lo indica, carga un valor inmediato de 16 bits, con signo o zero extendido (sin signo), o de 32 bits.

li $t1, Const

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 Palabra (sw)

sw $t1, Const($t2)

Guarda la palabra contenida en el registro $t1 en la posición de memoria dada por $t2 + la constante de offset. En lugar de Const($t2) también puede colocarse una etiqueta con su offset respectivo, como se vió en el caso de load adress, por ejemplo.

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.

Enlaces de Interés