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 ≤ cteExisten 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 pilaLlamada al Sistema

syscall
Llama al sistema para que se haga lo que pide