En estos ejercicios ya vemos el uso de funciones, y por tanto de las instrucciones jal y jr. Recuerdo que es recomendable, aunque más bien necesario, echar un vistazo a las instrucciones para conocerlas bien y si no tenéis ni idea de ensamblador MIPS recomiendo visitar la anterior entrada en la que os dejé unos ejemplos muy sencillos para entender las instrucciones más usuales.
NOTA: Aunque en algunos ejercicios piden una función, para poder probarla añado un "main" y un segmento de datos de prueba. Pero recordad que la función debe funcionar independientemente de esos datos.
Función factorial en ensamblador MIPS.
# función factorial (argumento en $a1, valor devuelto en $v1) # número en 'ene' # valor factorial en 'resul' .data ene: .word 5 .space 28 resul: .word 0 .text main: lw $a1,ene($0) jal fact sw $v1,resul($0) li $v0,10 syscall fact: addi $v1, $0, 1 add $8, $a1, $0 loop: beq $8, $0, fin mul $v1, $v1,$8 subi $8, $8, 1 j loop fin: jr $31
Realizad una función llamada ‘sumatorio” que sume las componentes de un vector de números enteros almacenados en memoria. Los parámetros de entrada a la función son, la dirección de comienzo del vector en $a0 y el número de componentes en $a1. La función devuelve el valor de la suma en $v0.
.data suma: .word 0 .space 24 tamano: .word 10 datos1: .word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 .word 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 .text main: la $a0, datos1 lw $a1, tamano($0) jal sumatorio sw $v0, suma($0) li $2, 10 syscall sumatorio: add $10, $0, $0 # inicializo 10 add $v0, $0, $0 # inicializo 8 etq1: lw $9, 0($a0) add $v0,$v0,$9 addi $a0,$a0,4 addi $10,$10, 1 bne $10,$a1,etq1 jr $ra
A partir de la posición de memoria etiquetada como ‘A’ hay almacenada una secuencia de ‘n’ números. El valor ‘n’ se encuentra almacenado en la posición previa a ‘A’. Realizad un programa que lea dicha secuencia y la transforme en otra que se almacene a partir de la posición etiquetada como ‘B’ y obedezca la siguiente expresión de transformación:
B(0)=A(0)
B(i)= (A(i)+A(i-1))/2 i=1,2,...,n-1
Utilizad la cabecera de programa que se indica a continuación.
.data
.space 28
.word 5
A: .word 2,4,5,7,4,9,6,8,9,4,5,6,7,8,9,3,4,5,9,7,2,3,4,777
B: .word 0
.text
addi $10, $0, -4
lw $10, A($10) # en el registro 10 tengo n
beq $10, $0, fin
slt $15, $10, $0
bne $15, $0, fin
add $9, $0, $0
lw $8,A($9) # En el registro 8, A
lw $11, B($9) # En el registro 11, B
sw $8, B($0) # B(0) = A(0)
addi $14, $10, -1
loop: addi $9, $9, 4 # incrementar puntero
addi $10, $9, -4
lw $12, A($10)
lw $8,A($9)
add $13, $8, $12
div $13, $13, 2
sw $13, B($9)
addi $14, $14, -1
bne $14, $0, loop
fin: li $2, 10
syscall
A partir de la posición de memoria etiquetada como ‘datos’ hay almacenada una secuencia de ‘n’ números. El valor ‘n’ se encuentra almacenado en la posición previa a ‘datos’. Realizad un programa que calcule la media aritmética de dicha secuencia y la almacene en la posición etiquetada como ‘med’. Utilizad la cabecera de programa que se indica a continuación.
.data
.space 28
.word 5
datos: .word 2,4,5,7,4,95,6,8,9,4,555,6,7,8,9,3,4,5,9,7,2,3,4,777
med: .word 0
.text
addi $9, $10, -4
lw $9, datos($9) # tengo n en $9
slti $13, $9, 1
add $10, $0, $0
add $11, $0, $0
add $12, $0, $0
bne $0, $13, fin
suma:
lw $8, datos($12)
add $11, $11, $8
addi $10, $10, 1
addi $12, $12, 4
bne $10, $9, suma
div $11, $11, $9
sw $11, med($0)
fin:
li $2, 10
syscall
No tienes un ejemplo de un programa el cual reciba cadenas y las ordene alfabéticamente?
ResponderEliminar