Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data
- entrada: .asciiz "Introduzca un número por teclado: "
- salida: .asciiz "\nEl factorial es: "
- .globl main
- .text
- main:
- li $v0, 4
- la $a0, entrada
- syscall # imprime la cadena 'entrada'
- li $v0, 5 # Llamada al sistema que lee un entero de teclado
- syscall
- move $a0, $v0 # Pasamos el entero leído a $a0 (argumento de la función fact)
- jal fact # Llamada a la función fact
- move $t0, $v0
- li $v0, 4
- la $a0, salida
- syscall # imprime la cadena 'salida'
- move $a0, $t0 # Llamada al sistema que imprime un entero (resultado)
- li $v0, 1
- syscall
- li $v0, 10 # Llamada al sistema para finalizar la ejecución
- syscall # (fin de la función main)
- fact:
- beqz $a0, base # Si es el 0 es el caso base
- # Como el entero no era el 0...
- addi $sp, $sp, -4 # Se apila el $ra para no perder la dirección
- sw $ra, ($sp) # de retorno
- addi $sp, $sp, -4 # Se apila el argumento (n).
- sw $a0, ($sp) #
- addi $a0, $a0, -1 # $a0 = n-1
- jal fact # Llamada recursiva a la función para que calcule
- # el fact de n-1
- lw $a0, ($sp) # Desapilamos el valor n que habíamos guardado
- addi $sp, $sp, 4
- lw $ra, ($sp) # Desapilamos el $ra que habíamos guardado
- addi $sp, $sp, 4
- mult $a0, $v0 # Multiplicamos $a0 por $v0, es decir: n*(n-1)!
- mflo $v0 # En $v0 tenemos el fact de n
- jr $ra # Fin de la función fact
- base: # A esta parte se llega si el argumento es 0
- li $v0, 1 # El fact de 0 es 1. El resultado se
- jr $ra # devuelve en $v0 y se sale de la función.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement