Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data
- strTitulo: .asciiz "-------[CALCULADORA]-------\nOPERAÇÕES:\n[+] SOMA\n[-] SUBTRACAO\n[&] CONJUNCAO\n[|] DISJUNCAO\n[!] FATORIAL"
- strOperacao: .asciiz "\nDigite a operação : "
- strOperacaoErro: .asciiz "\nOperador inválido! Tente novamente: "
- strValorUm: .asciiz "\nDigite o primeiro valor: "
- strValorDois: .asciiz "\nDigite o segundo valor: "
- strResultado: .asciiz "\nResultado: "
- strRepeteOperacao: .asciiz "\nOutra operação? (s/n): "
- strRepeteOperacaoErro: .asciiz "\nResposta inválida! Tente novamente: "
- strFim: .asciiz "\nFim."
- .text
- .globl titulo
- titulo:
- addi $v0, $0, 4
- la $a0, strTitulo
- syscall # imprime strTitulo
- primeiroValor:
- addi $v0, $0, 4
- la $a0, strValorUm
- syscall # Imprime texto do primeiro valor
- addi $v0, $0, 5
- syscall # Pede o primeiro valor
- move $s1, $v0 # Guarda o primeiro valor em $s1
- operacao:
- addi $v0, $0, 4
- la $a0, strOperacao
- syscall # imprime strOperacao
- addi $v0, $0, 12
- syscall # lê o operador
- add $a1, $v0, $0 # guarda o operador em $a1
- switch:
- addi $9, $0, 0x2b # +
- beq $a1, $9, calculoSoma
- addi $9, $0, 0x2d # -
- beq $a1, $9, calculoSubtracao
- addi $9, $0, 0x7c # |
- beq $a1, $9, calculoDisjuncao
- addi $9, $0, 0x26 # &
- beq $a1, $9, calculoConjuncao
- addi $9, $0, 0x21 # !
- beq $a1, $9, calculoFatorial
- j erroOperacaoInvalida
- calculoSoma:
- addi $v0, $0, 4
- la $a0, strValorDois
- syscall # Imprime texto do segundo valor
- addi $v0, $0, 5
- syscall # Pede o segundo valor
- move $s2, $v0 # Guarda o segundo valor em $s2
- add $s0, $s1, $s2 # Calculo da soma
- j resposta
- calculoSubtracao:
- addi $v0, $0, 4
- la $a0, strValorDois
- syscall # Imprime texto do segundo valor
- addi $v0, $0, 5
- syscall # Pede o segundo valor
- move $s2, $v0 # Guarda o segundo valor em $s2
- sub $s0, $s1, $s2 # Calculo da soma
- j resposta
- calculoDisjuncao:
- addi $v0, $0, 4
- la $a0, strValorDois
- syscall # Imprime texto do segundo valor
- addi $v0, $0, 5
- syscall # Pede o segundo valor
- move $s2, $v0 # Guarda o segundo valor em $s2
- or $s0, $s1, $s2 # Calculo da disjuncao
- j resposta
- calculoConjuncao:
- addi $v0, $0, 4
- la $a0, strValorDois
- syscall # Imprime texto do segundo valor
- addi $v0, $0, 5
- syscall # Pede o segundo valor
- move $s2, $v0 # Guarda o segundo valor em $s2
- and $s0, $s1, $s2 # Calculo da conjuncao
- j resposta
- calculoFatorial:
- jal fact # call fact(n)
- addi $s0, $v0, 0
- j resposta
- fact:
- sub $sp,$sp, 8 # Ajusta a stack para 2 items
- sw $ra, 4($sp) # Guarda endereço de retorno
- sw $s1, 0($sp) # Guarda argumento n
- slti $t0,$s1, 1 # testa se n < 1
- beq $t0,$zero,L1 # Se n >= 1, vai fazer outra chamada
- li $v0,1 # Se não for devolve 1
- addi $sp,$sp, 8 # liberta o espaço da stack antes de
- jr $ra # retornar
- L1: sub $s1,$s1,1 # Nova chamada: novo argumento (n - 1)
- jal fact # call fact com (n - 1)
- # Ponto de retorno da chamada recursiva:
- lw $s1, 0($sp) # Recupera o argumento passado
- lw $ra, 4($sp) # Recupera o endereço de retorno
- add $sp,$sp, 8 # Liberta o espaço da stack
- mul $v0,$s1,$v0 # Calcula n * fact (n - 1)
- jr $ra # Retorna com o resultado
- erroOperacaoInvalida:
- addi $v0, $0, 4
- la $a0, strOperacaoErro
- syscall
- j operacao
- resposta:
- addi $v0, $0, 4
- la $a0, strResultado
- syscall # Imprime texto da resposta
- addi $v0, $0, 1
- addi $a0, $s0, 0
- syscall # Imprime valor do resultado
- j outraOperacao
- outraOperacao:
- addi $v0, $0, 4
- la $a0, strRepeteOperacao
- syscall # Pergunta se o usuario quer outra operacao
- addi $v0, $0, 12
- syscall
- add $a1, $v0, $0 # Le a resposta do usuario e salva em #a1
- # Se for 's' vai para primeiroValor, se for 'n' vai para sair
- addi $9, $0, 0x73
- beq $a1, $9, primeiroValor
- addi $9, $0, 0x6e
- beq $a1, $9, sair
- # Se o usuário não digitou nem 's' nem 'n'
- addi $v0, $0, 4
- la $a0, strRepeteOperacaoErro # Imprime que o usuário errou
- syscall
- j outraOperacao # Repete o bloco
- sair:
- addi $v0, $0, 4
- la $a0, strFim
- syscall
- li $v0, 10
- syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement