Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data #Textos a imprimir
- entrada1: .asciiz "Introduce el valor de m: \n"
- entrada2: .asciiz "Introduce el valor n: \n"
- resultado: .asciiz " Es el resultado para la funcion de Ackerman para los valores dados de m y n"
- .text
- .globl main
- ackerman: #Comienzo del procedimiento de la funcion de ackerman
- sub $sp, $sp, 8 #Hace espacio para 2 datos en la pila
- sw $s0, 4($sp)
- sw $ra, 0($sp)
- # Caso en el que m=0
- bne $a0, $0, segundocaso # Si m!=0 salta a segundo caso. Si m=0 ejecuta la sigte. linea
- addi $v0, $a1, 1 # si m=0, ackerman(m,n) = n+1= $a1+1
- j final # Salto al final
- # caso m distinto de 0, n=0
- segundocaso:
- bne $a1, $0, tercercaso #Si n!=0 salta al tercer caso, si n=0 ejecuta la sigte. linea
- sub $a0, $a0, 1 # m=m-1
- li $a1, 1 # Le asigna a n el valor de 1
- jal ackerman # Con m=m-1 y n=1 llama de nuevo a la funcion ackerman
- # Al mismo tiempo vincula la dirección de retorno para que una vez se ejecute ackerman
- #Vuelva a este punto
- j final #Salta al final
- # ultimo caso, m y n distintos de 0
- tercercaso:
- sub $a1, $a1, 1 # Hace n=n-1
- move $s0, $a0 # guarda m en un registro preservado por los subprogramas
- jal ackerman # Con = ack(m,n-1)
- move $a1, $v0 # El resultado de la ejecución anterior se almacena en n ($a1)
- sub $a0, $s0, 1 # Como $a0 posiblemente fue cambiado durante la ejecución anterior
- # De la función, el valor de m almacenado en s0 se introduce de nuevo en a0
- jal ackerman # Ahora con n=Ackerman(m,n-1) y m=m-1 se procede a ejecutar de nuevo
- #La funcion de ackerman
- final:
- lw $s0, 4($sp)
- lw $ra, 0($sp)
- addi $sp, $sp, 8
- jr $ra
- main: #Inicio del cuerpo principal del programa
- #Muestra el mensaje de la entrada de datos
- la $a0, entrada1 # Carga la dirección de entrada1 al registro de argumentos
- li $v0, 4 # el "4" le ordena al sistema imprimir el texto que acaba de
- # ser obtenido
- syscall # Ejecuta la acción anterior
- li $v0, 5 #1 Le dice al sistema que el dato a ingresar es un entero
- syscall # Ejecuta la acción anterior
- #El dato es almacenado temporalmente en v0
- move $t0, $v0 #Se transfiere a t0 porque el valor de V0 cambiara
- #Muestra el mensaje de la entrada de datos
- li $v0, 4 # Le ordena al sistema imprimir un texto (string)
- la $a0, entrada2
- syscall
- li $v0, 5 #1 Le dice al sistema que v0 guardara un entero
- syscall
- move $a1, $v0 # Almacena el valor de n en el registro a1
- move $a0, $t0 # Almacena el valor de m en el registro a0
- jal ackerman
- #Al finalizar la ejecución de la funcion, el resultado proviene de v0
- move $a0, $v0
- li $v0, 1 # Indica que se va a imprimir un entero proveniente de $v0
- syscall
- la $a0, resultado #Carga la direccion del texto resultado en a0
- li $v0, 4 #Indica que se va a imprimir un string
- syscall #Ejecuta la accion anterior
- li $v0,10 #Codigo para salir
- syscall #Ejecuta la salida del programa
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement