Advertisement
Guest User

Untitled

a guest
Feb 3rd, 2019
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 2.87 KB | None | 0 0
  1. .data  #Textos a imprimir
  2.     entrada1: .asciiz "Introduce el valor de m: \n"
  3.     entrada2: .asciiz "Introduce el valor n: \n"
  4.     resultado: .asciiz " Es el resultado para la funcion de Ackerman para los valores dados de m y n"
  5. .text
  6. .globl main
  7.  
  8.  
  9. ackerman: #Comienzo del procedimiento de la funcion de ackerman
  10.  
  11. sub $sp, $sp, 8  #Hace espacio para 2 datos en la pila
  12. sw $s0, 4($sp)
  13. sw $ra, 0($sp)
  14.  
  15. # Caso en el que m=0
  16.  
  17. bne $a0, $0, segundocaso # Si m!=0 salta a segundo caso. Si m=0 ejecuta la sigte. linea
  18. addi $v0, $a1, 1 # si m=0, ackerman(m,n) = n+1= $a1+1
  19. j final # Salto al final
  20.  
  21. # caso m distinto de 0, n=0
  22.  
  23. segundocaso:
  24.  
  25. bne $a1, $0, tercercaso #Si n!=0 salta al tercer caso, si n=0 ejecuta la sigte. linea
  26. sub $a0, $a0, 1 # m=m-1
  27. li $a1, 1 # Le asigna a n el valor de 1
  28. jal ackerman  # Con m=m-1 y n=1 llama de nuevo a la funcion ackerman
  29. # Al mismo tiempo vincula la dirección de retorno para que una vez se ejecute ackerman
  30. #Vuelva a este punto
  31. j final #Salta al final
  32.  
  33. # ultimo caso, m y n distintos de 0
  34.  
  35. tercercaso:
  36. sub $a1, $a1, 1 # Hace n=n-1
  37. move $s0, $a0 # guarda m en un registro preservado por los subprogramas
  38. jal ackerman # Con  = ack(m,n-1)
  39.  
  40. move $a1, $v0 # El resultado de la ejecución anterior se almacena en n  ($a1)
  41. sub $a0, $s0, 1 # Como $a0 posiblemente fue cambiado durante la ejecución anterior
  42. # De la función, el valor de m almacenado en s0 se introduce de nuevo en a0
  43.  
  44. jal ackerman # Ahora con n=Ackerman(m,n-1) y m=m-1 se procede a ejecutar de nuevo
  45. #La funcion de ackerman
  46.  
  47.  
  48. final:
  49. lw $s0, 4($sp)
  50. lw $ra, 0($sp)
  51. addi $sp, $sp, 8
  52. jr $ra
  53.  
  54.     main: #Inicio del cuerpo principal del programa
  55.  
  56.     #Muestra el mensaje de la entrada de datos
  57.  
  58.     la $a0, entrada1 # Carga la dirección de entrada1 al registro de argumentos
  59.     li $v0, 4  # el "4" le ordena al sistema imprimir el texto que acaba de
  60.     # ser obtenido
  61.     syscall # Ejecuta la acción anterior
  62.    
  63.     li $v0, 5 #1 Le dice al sistema que el dato a ingresar es un entero
  64.    
  65.     syscall # Ejecuta la acción anterior
  66.     #El dato es almacenado temporalmente en v0
  67.     move $t0, $v0 #Se transfiere a t0 porque el valor de V0 cambiara
  68.    
  69.  
  70.     #Muestra el mensaje de la entrada de datos
  71.     li $v0, 4  # Le ordena al sistema imprimir un texto (string)
  72.     la $a0, entrada2
  73.     syscall
  74.     li $v0, 5 #1 Le dice al sistema que v0 guardara un entero
  75.     syscall
  76.     move $a1, $v0   # Almacena el valor de n en el registro a1
  77.     move $a0, $t0   # Almacena el valor de m en el registro a0
  78.    
  79.     jal ackerman
  80.     #Al finalizar la ejecución de la funcion, el resultado proviene de v0
  81.     move $a0, $v0
  82.     li $v0, 1  # Indica que se va a imprimir un entero proveniente de $v0  
  83.     syscall
  84.    
  85.     la $a0, resultado #Carga la direccion del texto resultado en a0
  86.     li $v0, 4  #Indica que se va a imprimir un string
  87.     syscall #Ejecuta la accion anterior  
  88.         li $v0,10  #Codigo para salir
  89.         syscall #Ejecuta la salida del programa
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement