├── App.java ├── Trabalho - Assembly do Processador MIPS_v2.pdf └── mips.asm /App.java: -------------------------------------------------------------------------------- 1 | import java.util.Scanner; 2 | 3 | public class App 4 | { 5 | public static void main(String[] args) { 6 | System.out.println("Programa Ackermann"); 7 | System.out.println("“Componentes: "); 8 | 9 | while (true) { 10 | String s = lerValoresEPrintar(); 11 | System.out.println(s); 12 | } 13 | } 14 | 15 | public static String lerValoresEPrintar() { 16 | Scanner sc = new Scanner(System.in); 17 | 18 | System.out.println("Digite os parâmetros m e n para calcular A(m, n) ou -1 para abortar a execução"); 19 | int m = sc.nextInt(); 20 | if (m < 0) System.exit(0); 21 | int n = sc.nextInt(); 22 | if (n < 0) System.exit(0); 23 | 24 | return "A(" + m + ", " + n + ") = " + ackermann(m, n); 25 | } 26 | 27 | public static int ackermann(int m, int n) { 28 | int result = 0; 29 | 30 | if (m == 0) result = n + 1; 31 | 32 | if (m > 0 && n == 0) result = ackermann(m - 1, 1); 33 | 34 | if (m > 0 && n > 0) result = ackermann(m - 1, ackermann(m, n - 1)); 35 | 36 | return result; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Trabalho - Assembly do Processador MIPS_v2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erik-monteiro/oap/bbad04fbbbb6a711e13becafea4245a4fdea266d/Trabalho - Assembly do Processador MIPS_v2.pdf -------------------------------------------------------------------------------- /mips.asm: -------------------------------------------------------------------------------- 1 | .text 2 | .globl main 3 | 4 | main: 5 | # --- Printa Strings --- 6 | la $a0, string1 7 | li $v0, 4 8 | syscall 9 | la $a0, string2 10 | li $v0, 4 11 | syscall 12 | j lerValoresEPrintarResultado # go to lerValoresEPrintarResultado func 13 | 14 | lerValoresEPrintarResultado: 15 | la $a0, string3 # carrega endereço da string3 16 | li $v0, 4 # load immediate print_string 17 | syscall 18 | 19 | li $v0, 5 #​ le inteiro 20 | syscall 21 | move $s0, $v0 # int m = getchar(); 22 | blt $s0, $zero, exit # se m < 0 go to exit 23 | 24 | li $v0, 5 25 | syscall 26 | move $s1, $v0 # int n = getchar(); 27 | blt $s1, $zero, exit # se n < 0 go to exit 28 | 29 | move $a0, $s0 # $a0 = m 30 | move $a1, $s1 # $a1 = n 31 | jal ackermann # go to ackermann 32 | 33 | la $a0, resultPrint # carrega endereço da string 34 | li $v0, 4 # load immediate print_string 35 | syscall 36 | li $v0, 1 # print int 37 | move $a0, $s2 # argumento da função = result 38 | syscall # printa resultado ackermann(m, n) 39 | j lerValoresEPrintarResultado # repete o looping até serem digitados 'm' ou 'n' negativos 40 | 41 | ackermann: 42 | addi $sp, $sp, -12 # aloca 12 bytes na pilha 43 | sw $ra, 0($sp) # salva $ra na pilha 44 | sw $s0, 4($sp) # coloca variável 'm' na pilha 45 | sw $s1, 8($sp) # coloca variável 'n' na pilha 46 | 47 | move $s0, $a0 # $s0 = m 48 | move $s1, $a1 # $s1 = n 49 | move $s2, $zero # result = 0 50 | 51 | beq $s0, $zero, recursao1 # se m == 0 go to recursao1 52 | bgt $s0, $zero, mMaiorQueZero # se m > 0 go to mMaiorQueZero 53 | 54 | recursao1: 55 | addi $s2, $s1, 1 # result = n + 1 56 | j gerenciaPilha 57 | 58 | mMaiorQueZero: 59 | beq $s1, $zero, recursao2 # se n == 0 go to recursao2 60 | bgt $s1, $zero, recursao3 # se n > 0 go to recursao3 61 | 62 | recursao2: 63 | addi $a0, $s0, -1 # a0 : M = (m-1) 64 | addi $a1, $0, 1 # a1 : N = 1 65 | jal ackermann # recursão 66 | move $s2, $v0 # s2 = A(m-1,1) 67 | j gerenciaPilha 68 | 69 | recursao3: 70 | move $a0, $s0 # a0 : M = m 71 | addi $a1, $s1, -1 # a1 : N = (n-1) 72 | jal ackermann 73 | move $a1, $v0 # a1 : N = A(m,n-1) 74 | addi $a0, $s0, -1 # a0 : M = (m-1) 75 | jal ackermann # recursão 76 | move $s2, $v0 # s2 = A(m-1, A(m,n-1)) 77 | j gerenciaPilha 78 | 79 | gerenciaPilha: 80 | move $v0, $s2 81 | lw $ra, 0($sp) 82 | lw $s0, 4($sp) 83 | lw $s1, 8($sp) 84 | 85 | addi $sp, $sp, 12 # desaloca pilha 86 | jr $ra 87 | 88 | exit: 89 | li $v0, 10 # exit 90 | syscall 91 | 92 | .data 93 | string1: .asciiz "Programa Ackermann​\n" 94 | string2: .asciiz "Componentes: ​\n" 95 | string3: .asciiz "\nDigite os parâmetros m e n para calcular A(m, n) ou -1 para abortar a execução\n" 96 | result: .space 4 # int result; 97 | resultPrint: .asciiz "A(m , n) = " 98 | .align 2 99 | --------------------------------------------------------------------------------