# Fatorial em MIPS Assembly # # Emilio Francesquini e.francesquini@ufabc.edu.br # 2020.Q1 # Este código evita deliberadamente o uso de pseudoinstruções como # move, li, ... O seu uso pode simplificar bastante o código e é # um bom exercício para compreender o programa. # Todo o código do programa fica na seção de texto .text # Declara a função main como uma global .globl main # Calcula o fatorial de um número n. # Recebe n em $a0 e devolve n! em $v0. fact: beq $a0, $zero, fact_zero # Trata caso especial 0 add $t1, $zero, $a0 # res = n addi $t0, $a0, -1 # i = n - 1 fact_loop: slti $t2, $t0, 1 # se i < 1 então t2 = 1 bne $t2, $zero, fact_ret # então terminou mul $t1, $t1, $t0 # res = res * i addi $t0, $t0, -1 # i-- j fact_loop fact_zero: addi $v0, $zero, 1 # 0! = 1 jr $ra # retorna fact_ret: add $v0, $zero, $t1 # preenche resultado jr $ra # retorna # Função principal main: # Lê o valor n do usuário addi $v0, $zero, 5 # read_int syscall code = 5 syscall # lê n chamada de sistema add $a0, $zero, $v0 # parametro da chamada fact jal fact # chama fact add $s0, $zero, $v0 # guarda o resultado em $s0 # Imprime resultado addi $v0, $zero, 1 # print_int syscall code = 1 add $a0, $zero, $s0 syscall # Sai do programa addi $v0, $zero, 10 # exit syscall code = 10 syscall