Ensamblador MIPS

Trabajar con variables

Uso de estas

Poner una constante en un registro li

li $t2,0xABCD Pones el registro y después la constante

Poner en un registro la dirección

la $11,array pone en $11 la dirección del array

Ponerla en un registro lw

Lw

cargar 4 bytes

Lh

cargar 2 bytes

Lv

cargar 1 byte

Para usar una variable en MIPS primero la tienes que poner en un registro para eso pones lo siguiente y estarías guardándola en t0

lw $t0, numeros Primero registro y después variable

Sacarla de un registro sw

Una vez terminado puedes guardarla de nuevo en la variable sacando lo que tenías en el registro

sw $t2, suma Primero registro y después variable

Convenio de registros

Copiar variables move

Se compone de move dondePega loQuePega

Construcción de variables

Al construir tu variable tienes que especificarle a la maquina cosa como con que va a trabajar y cuanta memoria va a tener disponible

.align numero

Se usa para que la información no se quede partida en varios bytes

Puedes usar 0 para 1 byte, 1 para 2 bytes, 2 para 4B y 3 para 8B

.asciiz

Sirve para usar cadenas de caracteres

Es como el .ascii pero con la marca de fin ya puesta

Puedes usarla así: msg: .asciiz “Hola Mundo”

byte

1 byte

.half

Para usar datos con dos bytes

.word

4 bytes

.space

Hay que poner un a delante

Para reservar un espacio en especifico

Operaciones

add

Funciona así:

add $a, $b, $c$a = $b + $c

Si pones addu no se preocupa del desbordamiento y no tiene signo unsigned

Si pones addi puedes sumar un registro y un numero

sub

Funciona así:

sub $a, $b, $c$a = $b - $c

Si pones subu no se preocupa del desbordamiento y no tiene signo unsigned

and

Funciona así:

sub $a, $b, $c$a = $b & $c

Si pones andi puedes hacer el “AND” un registro y un numero

or

Funciona así:

sub $a, $b, $c$a = $b or $c

Si pones ori puedes hacer el “OR” un registro y un numero

Desplazar a la izquierda

sll

Desplazar a la derecha

srl

Desplazar a la derecha con cambio de signo

sra mirar en chat gpt

Saltos

Incondicional

Saltar a etiqueta j xxxx

j etiqueta Salta a la etiqueta

Saltar a dirección

jr rd Salta a la instrucción del registro rd

Condicional

Funciona así:

bne $t3, $t4, Finif # Compara i,j y salta a Finif si son distintos
addu $t0, $t1, $t2 # Suma g más h y lo guarda en f.
Finif: sub $t0, $t0, $t3 # Resta i de f y lo guarda en f.

Cabe recalcar que cuando saltas empieza a operar de nuevo justamente en la línea de la etiqueta

A continuación vas a ver todos los que hay y se componen en su mayoría que los comparas y si se cumple salta a la etiqueta(etiq) que le hayas asignado

bgt rs, rt, etiq #rs > rt
blt rs, rt, etiq #rs < rt
bge rs, rt, etiq #rs ≥ rt
ble rs, rt, etiq #rs ≤ rt
beqz rs, etiq #rs = 0
bnez rs, etiq #rs ̸= 0
beq rs, cte, etiq #rs = cte
bne rs, cte, etiq #rs ̸= cte
bgt rs, cte, etiq #rs > cte
blt rs, cte, etiq #rs < cte
bge rs, cte, etiq #rs ≥ cte
ble rs, cte, etiq #rs ≤ cte

Existen más como estas pero ya no son tan necesarias

beq rs, rt, etiq #rs = rt
bne rs, rt, etiq #rs ̸= rt
bgtz rs, etiq #rs > 0
bltz rs, etiq #rs < 0
bgez rs, etiq #rs ≥ 0
blez rs, etiq #rs ≤ 0

Estructuras de condicionales

if

Código en C

if (i == j) { // Compara i y j y si son iguales
f = g + h; // suma g y h y lo guarda en f.
}
f = f - i; // Resta i de f y lo guarda en f
// (esta última instrucción no depende de la condición).

Código en Ensamblador

bne $t3, $t4, Finif # Compara i,j y salta a Finif si son distintos
addu $t0, $t1, $t2 # Suma g más h y lo guarda en f.
Finif: sub $t0, $t0, $t3 # Resta i de f y lo guarda en f.

if / else

Código en C

if (i==j) { // Compara i y j y si son iguales
f = g + h; // suma g y h y lo guarda en f.
} else { // Si no (i y j son distintos) entonces
f = g - h; // resta h de g y lo guarda en f.
}
f = f - i; // Resta i de f y lo guarda en f
// (esta última instrucción no depende de la condición).

Código en Ensamblador

bne $t3, $t4, Sino # Compara i,j y salta a Sino si son distintos.
addu $t0, $t1, $t2 # Suma g más h y lo guarda en f.
j Finif # Salta a la etiqueta Finif para evitar
# ejecutar la parte del "else".
Sino: sub $t0, $t1, $t2 # Resta g de h y lo guarda en f.
Finif: sub $t0, $t0, $t3 # Resta i de f y lo guarda en f.

if / else if / else

Código en C

if (i == j) { // Compara i y j y si son iguales
f = g + h; // suma g y h y lo guarda en f.
} else if (i > j) { // Compara i y j y si i es mayor que j
f = g - h; // Resta h de g y lo guarda en f.
} else { // Si no (i es menor que j)
f = g - 2; // Resta 2 de g y lo guarda en f.
}
f = f - i; // Resta i de f y lo guarda en f
// (esta última instrucción no depende de la condición)

Código en Ensamblador

bne $t3, $t4, Sinoif # Compara i y j, salta a Sinoif si distintos.
addu $t0, $t1, $t2 # Suma g más h y lo guarda en f.
j Finif # Salta a Finif (al final).
Sinoif: ble $t3, $t4, Sino # Compara i y j, y salta a Sino si i es menorsub $t0, $t1, $t2 # Resta g de h y lo guarda en f.
j Finif # Salta a Finif (al final).
Sino: addiu $t0, $t1, -2 # Resta 2 de g y lo asigna a f.
Finif: sub $t0, $t0, $t3 # Resta i de f y lo guarda en f.

if & if

Código en C

if (i == j && g > h) { // Si i y j son iguales y g es mayor que h
f = g + h; // suma g y h y lo guarda en f.
} else { // Si no, entonces
f = g - h; // resta h de g y lo guarda en f.
}
f = f - i; // Resta i de f y lo guarda en f.
// (esta última instrucción está fuera del if).

Código en Ensamblador

bne $t3, $t4, Sino # Compara i y j, salta a Sino si son distintos.
ble $t1, $t2, Sino # Compara g y h, salta a Sino si g ≤ h.
addu $t0, $t1, $t2 # Suma g más h y lo guarda en f.
j Finif # Salta a la etiqueta Finif para evitar
# ejecutar la parte del "else".
Sino: sub $t0, $t1, $t2 # Resta g de h y lo guarda en f.
Finif: sub $t0, $t0, $t3 # Resta i de f y lo guarda en f.

if || if

Código en C

beq $t3, $t4, Si # Compara i,j y salta a Si si son iguales.
bgt $t1, $t2, Si # Compara g y h y salta a Si si g > h.
Sino: sub $t0, $t1, $t2 # Resta g de h y lo guarda en f.
j Finif # Salta a la etiqueta Finif para evitar
# ejecutar la parte del "if".
Si: addu $t0, $t1, $t2 # Suma g más h y lo guarda en f.
Finif: sub $t0, $t0, $t3 # Resta i de f y lo guarda en f.

Código en Ensamblador

bne $t3, $t4, Sino # Compara i,j y salta a Sino si son distintos.
addu $t0, $t1, $t2 # Suma g más h y lo guarda en f.
j Finif # Salta a la etiqueta Finif para evitar
# ejecutar la parte del "else".
Sino: sub $t0, $t1, $t2 # Resta g de h y lo guarda en f.
Finif: sub $t0, $t0, $t3 # Resta i de f y lo guarda en f.

Bucles

While

Código en C

int num = 9; // Inicializa num a 9.
int resul = 0; // Inicializa resul a 0.
int i = 0; // Inicializa i a 0.
while (i <= 10) { // Bucle while hasta que i sea mayor que 10.
resul += num * i; // Multiplica num por i y lo suma a resul.
i++; // Incrementa i en 1.
}

Código en Ensamblador

li $t1, 9 # Inicialización de num.
li $t2, 0 # Inicialización de resul.
li $t3, 10 # Inicialización de $t3 para el bgt
li $t0, 0 # Inicialización de i (1).
while: bgt $t0, $t3, finwhile # Comprobación de la condición (2).
# Cuerpo del bucle (3).
mul $t4, $t1, $t0 # Cálculo de num * i.
addu $t2, $t2, $t4 # Suma num * i a resul.
addiu $t0, $t0, 1 # Incrementa i en 1.
j while # Salta para hacer la siguiente iteración
finwhile:

for

Código en C

int num = 9; // Inicializa num a 9.
int resul = 0; // Inicializa resul a 0.
for (int i = 0; i <= 10; i++) { // Bucle for mientras i ≤ 10.
resul += num * i; // Multiplica num por i y lo suma a resul}

Código en Ensamblador

li $t1, 9 # Inicialización de num.
li $t2, 0 # Inicialización de resul.
li $t3, 10 # Inicialización de $t3 para el bgt
li $t0, 0 # Inicialización de i (1).
for: bgt $t0, $t3, finfor # Comprobación de la condición (2).
# Cuerpo del bucle (3).
mul $t4, $t1, $t0 # Cálculo de num * i.
addu $t2, $t2, $t4 # Suma num * i a resul.
addiu $t0, $t0, 1 # Incrementa i en 1 (4).
j for # Salta para hacer la siguiente iteración.
finfor:

Funciones

addiu $sp,$sp,-8 # hace sitio en la pila para guardar 2 registros
sw $s0,4($sp) # apila $s0
sw $ra,0($sp) # apila $ra

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#-------Para no perder valores apilamos y desapilamos al principio y al final-------#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

lw $ra,0($sp) # recupera el valor de $ra
lw $s0,4($sp) # recupera el valor de $s0
addiu $sp,$sp,8 # devuelve el espacio usado a la pila

Llamada al Sistema

syscall

Llama al sistema para que se haga lo que pide