diferencia entre LW y SW en el ensamblaje MIPS

2

Una de mis preguntas para la tarea fue encontrar el tercer elemento almacenado en una matriz en MIPS, aquí está mi código

la $t0, array0 # Loads the address of variable array0 into $t0
lw $t1, 12($t0) # Loads the value of the 3rd element of variable array0 using the address stored of array0 in $t0 into $t1
li $v0, 1 # Set $v0 to 1, this tells syscall to # print the integer specified by $t1
syscall # Now print the integer

Ahora la siguiente instrucción es almacenar el valor en el registro $ s2. Mi confusión en este momento es si usar SW (almacenar palabra) $ s2, $ t1 o LW (cargar palabra) $ s2, $ t1. Si alguien pudiera dar una explicación sólida de cuál es la respuesta correcta y cómo averiguar cuándo usar SW o LW, sería muy apreciado.

    
pregunta user1873746

3 respuestas

3
  • LW carga una palabra de memoria en un registro.
  • SW guarda una palabra de un registro en RAM .

Para copiar de un registro a otro, normalmente realizaría una operación que dio como resultado que los datos de un registro se copiaron intactos en el otro registro, como:

or $s2, $zero, $t1

Eso tiene el efecto de ORing el valor en $ t1 con el valor en $ cero (que siempre es cero), cuyo resultado es $ t1 sin modificar, que luego se coloca en $ s2.

MIPS puede ser confuso ya que no hay instrucciones específicas para copiar de un registro a otro, pero esa es la esencia de RISC: ¿por qué tener una instrucción MOVE cuando puedes realizar la misma operación con un OR? Simplemente desperdicia instrucciones.

La mayoría de los ensambladores tienen una colección de macros para hacer su vida más fácil. Es posible que descubras que el tuyo tiene soporte para una instrucción MOVE virtual, así como para otros. Algunos se expanden a una sola instrucción, pero algunos se expanden a más de una, como "li", que generalmente se expande a algo como:

lui $t1, %HI(val)
ori $t1, $t1, %LO(val)

Es decir, cargue los 16 bits superiores en $ t1, luego O los 16 bits inferiores sobre su parte superior.

    
respondido por el Majenko
2

Wikipedia ofrece una visión general razonable de Conjunto de instrucciones MIPS

AFAIK, los ensambladores MIPS admiten la instrucción move , por lo que move $s2, $t1 "solo funcionará".
Utiliza una instrucción diferente para lograr el efecto (tal vez add $s2, $t1, $zero o or ... ), sin embargo, move es más fácil de leer y entender.

En mi humilde opinión, la notación utilizada en wikipedia es bastante útil:

lw $t,C($s)     # $t = Memory[$s + C]
sw $t,C($s)     # Memory[$s + C] = $t

Si está usando 'Simulador SPIM', entonces este Tutorial rápido de MIPS dice que print_int , que se llama con $ v0 = 1 , que es su código de ejemplo, tiene el parámetro, el número entero que se imprimirá, en $ a0.

Entonces, si la intención es imprimir el tercer entero en la matriz, sería mejor cargar ese tercer valor de la matriz en $ a0, y no en $ t1, es decir, lw $a0, 12($t0)

    
respondido por el gbulmer
1

Supongo que la confusión se debe al hecho de que en la sintaxis de ensamblaje de MIPS normalmente el operando de destino es el que está más a la izquierda.

Este no es el caso en la instrucción sw :
En la dirección sw , el registro del operando izquierdo se almacena en la dirección de memoria en función del registro del operando derecho.

    
respondido por el Curd

Lea otras preguntas en las etiquetas