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 syscallPor 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;)