// Nao eh possivel calcular o valor do fatorial de um numero razoavelmente grande, // pelo fato de nao caber numa word. O tamanho maximo eh 4294967296 // .data n: .word 0 s: .word 4 sd: .word 0 .text .globl start .ent start start: lw $8, n lw $9, s slt $11, $9, $8 // s < n bne $11, $0, OutroIf // Se !(s < n) vai pra OutroIf beq $8, $9, SaoIguais addi $25, $0, 1 j OutroIf SaoIguais: addi $15, $0, 3 OutroIf: // (n < 0) || (s < 0) slt $11, $8, $0 slt $12, $9, $0 or $11, $11, $12 beq $11, $0, OutroIf2 addi $24, $0, 2 OutroIf2: // (n == 0) || (s == 0) bne $8, $0, VerificarS addi $14, $0, 4 VerificarS: bne $9, $0, Pular addi $14, $0, 4 Pular: lw $4, n jal Fat // Calculando o fatorial(n) move $10, $2 // Armazenando o valor do fat(n) no $10 lw $4, s jal Fat // Calculando o fatorial(s) move $11, $2 // Armazenando o valor de fat(s) no $11 sub $12, $8, $9 // Armazenando em $12 o resultado de (n - s) move $4, $12 jal Fat // Calculando o fatorial(n - s) move $12, $2 // Armazenando o valor de fat(n - s) no $12 mult $11, $12 // fat(s) * fat(n - s) mflo $11 // Armazenando o valor de [fat(s) * fat(n - s)] no $11 div $10, $11 // fat(n) / (fat(s) * fat(n - s)) mflo $10 // Armazenando o valor de [fat(n) / (fat(s) * fat(n - s))] no $10 sw $10, sd // Armazenando o valor da combinação em $10 j Exit Fat: addi $29, $29, -8 // Alocando dois espaços de memória na pilha sw $31, 0($29) // Colocando o $ra sw $4, 4($29) // Colocando o $a0 beq $4, $0, Parada // Verficando se $a0 = 0 addi $4, $4, -1 // Decrementando $a0 em 1 jal Fat // Chamada recursiva lw $31, 0($29) lw $4, 4($29) addi $29, $29, 8 // POP 2 itens da pilha mult $2, $4 // Multiplicando $v0 com $a0 mflo $2 // Armazenando em $v0 jr $31 Parada: addi $29, $29, 8 // POP 2 intens da pilha addi $2, $0, 1 jr $31 Exit: .end start