Advertisement
Guest User

Untitled

a guest
Nov 5th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .data
  2.  
  3. strTitulo: .asciiz "-------[CALCULADORA]-------\nOPERAÇÕES:\n[+] SOMA\n[-] SUBTRACAO\n[&] CONJUNCAO\n[|] DISJUNCAO\n[!] FATORIAL"
  4. strOperacao: .asciiz "\nDigite a operação : "
  5. strOperacaoErro: .asciiz "\nOperador inválido! Tente novamente: "
  6. strValorUm: .asciiz "\nDigite o primeiro valor: "
  7. strValorDois: .asciiz "\nDigite o segundo valor: "
  8. strResultado: .asciiz "\nResultado: "
  9. strRepeteOperacao: .asciiz "\nOutra operação? (s/n): "
  10. strRepeteOperacaoErro: .asciiz "\nResposta inválida! Tente novamente: "
  11. strFim: .asciiz "\nFim."
  12.  
  13. .text
  14. .globl titulo
  15.  
  16. titulo:
  17. addi $v0, $0, 4
  18. la $a0, strTitulo
  19. syscall         # imprime strTitulo
  20.  
  21. primeiroValor:
  22. addi $v0, $0, 4
  23. la $a0, strValorUm
  24. syscall # Imprime texto do primeiro valor
  25. addi $v0, $0, 5
  26. syscall # Pede o primeiro valor
  27. move $s1, $v0 # Guarda o primeiro valor em $s1
  28.  
  29. operacao:
  30. addi $v0, $0, 4
  31. la $a0, strOperacao
  32. syscall         # imprime strOperacao
  33. addi $v0, $0, 12
  34. syscall         # lê o operador
  35. add $a1, $v0, $0    # guarda o operador em $a1
  36.  
  37. switch:
  38. addi $9, $0, 0x2b # +
  39. beq $a1, $9, calculoSoma
  40. addi $9, $0, 0x2d # -
  41. beq $a1, $9, calculoSubtracao
  42. addi $9, $0, 0x7c # |
  43. beq $a1, $9, calculoDisjuncao
  44. addi $9, $0, 0x26 # &
  45. beq $a1, $9, calculoConjuncao
  46. addi $9, $0, 0x21 # !
  47. beq $a1, $9, calculoFatorial
  48. j erroOperacaoInvalida
  49.  
  50. calculoSoma:
  51. addi $v0, $0, 4
  52. la $a0, strValorDois
  53. syscall # Imprime texto do segundo valor
  54. addi $v0, $0, 5
  55. syscall # Pede o segundo valor
  56. move $s2, $v0 # Guarda o segundo valor em $s2
  57.  
  58. add $s0, $s1, $s2 # Calculo da soma
  59. j resposta
  60.  
  61. calculoSubtracao:
  62. addi $v0, $0, 4
  63. la $a0, strValorDois
  64. syscall # Imprime texto do segundo valor
  65. addi $v0, $0, 5
  66. syscall # Pede o segundo valor
  67. move $s2, $v0 # Guarda o segundo valor em $s2
  68.  
  69. sub $s0, $s1, $s2 # Calculo da soma
  70. j resposta
  71.  
  72. calculoDisjuncao:
  73. addi $v0, $0, 4
  74. la $a0, strValorDois
  75. syscall # Imprime texto do segundo valor
  76. addi $v0, $0, 5
  77. syscall # Pede o segundo valor
  78. move $s2, $v0 # Guarda o segundo valor em $s2
  79.  
  80. or $s0, $s1, $s2 # Calculo da disjuncao
  81. j resposta
  82.  
  83. calculoConjuncao:
  84. addi $v0, $0, 4
  85. la $a0, strValorDois
  86. syscall # Imprime texto do segundo valor
  87. addi $v0, $0, 5
  88. syscall # Pede o segundo valor
  89. move $s2, $v0 # Guarda o segundo valor em $s2
  90.  
  91. and $s0, $s1, $s2 # Calculo da conjuncao
  92. j resposta
  93.  
  94. calculoFatorial:
  95. jal fact      # call fact(n)
  96. addi $s0, $v0, 0
  97. j resposta
  98.  
  99. fact:
  100. sub $sp,$sp, 8   # Ajusta a stack para 2 items
  101. sw $ra, 4($sp)   # Guarda endereço de retorno
  102. sw $s1, 0($sp)   # Guarda argumento n
  103.  
  104. slti $t0,$s1, 1   # testa se n < 1
  105. beq $t0,$zero,L1   # Se n >= 1, vai fazer outra chamada
  106.  
  107. li $v0,1      # Se não for devolve 1
  108. addi $sp,$sp, 8   # liberta o espaço da stack antes de
  109. jr $ra      # retornar
  110.  
  111. L1:   sub $s1,$s1,1   # Nova chamada: novo argumento (n - 1)
  112. jal fact      # call fact com (n - 1)
  113.  
  114. # Ponto de retorno da chamada recursiva:
  115. lw $s1, 0($sp)   # Recupera o argumento passado
  116. lw $ra, 4($sp)   # Recupera o endereço de retorno
  117. add $sp,$sp, 8   # Liberta o espaço da stack
  118.  
  119. mul $v0,$s1,$v0   # Calcula n * fact (n - 1)
  120.  
  121. jr $ra            # Retorna com o resultado
  122.  
  123. erroOperacaoInvalida:
  124. addi $v0, $0, 4
  125. la $a0, strOperacaoErro
  126. syscall
  127. j operacao
  128.  
  129. resposta:
  130. addi $v0, $0, 4
  131. la $a0, strResultado
  132. syscall # Imprime texto da resposta
  133. addi $v0, $0, 1
  134. addi $a0, $s0, 0
  135. syscall # Imprime valor do resultado
  136. j outraOperacao
  137.  
  138. outraOperacao:
  139. addi $v0, $0, 4
  140. la $a0, strRepeteOperacao
  141. syscall # Pergunta se o usuario quer outra operacao
  142.  
  143. addi $v0, $0, 12
  144. syscall
  145. add $a1, $v0, $0 # Le a resposta do usuario e salva em #a1
  146.  
  147. # Se for 's' vai para primeiroValor, se for 'n' vai para sair
  148. addi $9, $0, 0x73
  149. beq $a1, $9, primeiroValor
  150. addi $9, $0, 0x6e
  151. beq $a1, $9, sair  
  152.  
  153. # Se o usuário não digitou nem 's' nem 'n'
  154. addi $v0, $0, 4
  155. la $a0, strRepeteOperacaoErro # Imprime que o usuário errou
  156. syscall
  157. j outraOperacao # Repete o bloco
  158.  
  159. sair:
  160. addi $v0, $0, 4
  161. la $a0, strFim
  162. syscall
  163. li $v0, 10
  164. syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement