lunes, 9 de febrero de 2015

Ejercicios de ensamblador en MIPS

¿Qué pasa gente? Demasiado tiempo sin publicar nada...
Hoy traigo unos ejercicios en MIPS de unos alumnos de Electrónica, Robótica y Mecatrónica. Os los voy poniendo:

El primero dice asi:
Diseña un programa ensamblador que defina el vector de enteros de dos elementos V=(10,20) en la memoria de datos a partir de la dirección 0x10000000 y almacene su suma a partir de la dirección donde acaba el vector.
.data 0x10000000
vector: .word 10, 20 # Vector de elementos
res: .word 0  # Donde guardaremos el resultado
.text

 addi $8, $0, 4   # Guardo un 4 para pedir la segunda palabra del vector.
 lw $9, vector($0)
 lw $10, vector($8)
 
 add $11, $9, $10  # Sumamos en un temporal el resultado
 sw $11, res($0)   # Guardamos en memoria el resultado.
 
 li $2, 10
 syscall
Por aquí el segundo:
Diseña un programa ensamblador que divida los enteros 18,-1215 almacenados a partir de la dirección 0x10000000 entre el número 5 y que a partir de la dirección 0x10010000 almacene el cociente de dichas divisiones.

.data 0x10000000
entero1: .word 18
entero2: .word -1215
.data 0x10010000
res1: 0
res2: 0

.text
 addi $5, $0, 5
 # Primero un numero y luego el otro.
 lw $8, entero1($0)
 div $9, $8, $5
 sw $9, res1($0)
 
 # Ahora el segundo.
 lw $8, entero2($0)
 div $9, $8, $5
 sw $9, res2($0)
 
 li $2, 10
 syscall
 

El tercero lo he hecho usando una función AND y un número que en binario es todo unos excepto los bits que quiero poner a 0
Pon a cero los bits 3,7,9 del entero 0xabcd12bd almacenado en memoria a partir de la dirección 0x10000000, sin modificar el resto.
.data 0x10000000
valor: .word 0xabcd12bd
.text 
 addi $8, $0, 0xDD7FFFFF   
 lw $9, valor($0)
 and $10, $8, $9
 sw $10, valor($0)
 
 li $2, 10
 syscall

Y el cuarto ejercicio (es el sexto en la relación, pero los anteriores tampoco tenían mucha dificultad) dice tal que así:
Diseña un programa en ensamblador que defina un vector de enteros, V, inicializado según los siguientes valores (V=[2, -4, -6]). Y obtenga un vector de booleanos, tal que cada elemento será 1 si el correspondiente elemento en el vector de enteros es mayor o igual que cero y 0 en caso contrario.

.data 0x10000000
vector: .word 2, -4, -6
tam: .word 3
res: .word -1, -1, -1
.text 
 addi $2, $0, 1   # Constante 1 
 add $6, $0, $0  # Indice del array
 add $7, $0, $0  # Contador
 lw $8, tam($0)  # Tamaño a llegar
loop: 
 lw $9, vector($6) #Elemento del vector
 slt $10, $9, $0  # Si el segundo es menor que el tercero, el primero vale 1
 beq $10, $0, esPositivo
 # Si sigue por aquí es negativo
 sw $0, res($6)
 j vuelta
 
esPositivo:
 sw $2, res($6)
 j vuelta 
 
vuelta: addi $7, $7, 1
 addi $6, $6, 4
 bne $7, $8 loop
 
 li $2, 10
 syscall
 

Eso es todo. Espero que os sirvan. Si tenéis alguna duda comentadla.

Saludos;)