Assembler em mips–parte 3

Boa dia
 
Conforme combinado estou colocando um exemplo de calculadora em MIPS e explicando o que cada operação faz
 
 
  1. #Calculadora Básica #
  2. #Desenvolvido por: Diego Henrique da Silva #
  3. #data: 16/11/2010 21:23 #
  4. #########################################################################################
  5. #Projeto de calculadora para a disciplina de Fundamentos de Hardware II #
  6. #Objetivo: Construir uma calculadora para processadores MIPS de 32bits em assembler #
  7. #Tendo como opções soma,subtração, divisão e multiplicação, logo após deverão obter os #
  8. #termos e imprimir na tela o resultado, o programa está em loop para no fim de cada #
  9. #execução perguntar se quer realizar uma nova operação. #
  10. #########################################################################################
  11. .data #
  12. prompt1: .asciiz "Digite a operação pedida:\n1 - Soma\n2 – Subtração" #
  13. prompt2: .asciiz "\n3 – Multiplicação\n4 – Divisão\n5 - Sair\n" #
  14. termo1l: .asciiz "Digite o 1º termo\n" #
  15. termo2l: .asciiz "Digite o 2º termo\n" #
  16. erro: .asciiz "Número inválido, tente novamente.\n\n" #
  17. final: .asciiz "Obrigado por usar este software!" #
  18. resultadol: .asciiz "O resultado é: " #
  19. pulalinha: .asciiz "\n\n" #
  20. diveerr: .asciiz "O divisor não pode ser 0.\n\n" #
  21. #########################################################################################
  22. .text #
  23. main: #
  24. pr: li $v0, 4 #Especifica o serviço de impressão£o (4 na tela) #
  25. la $a0, prompt1 #carregando o endereço prompt para o registrador #
  26. syscall #imprime a string de prompt1 #
  27. li $v0, 4 #Especifica o serviço de impressão (4 na tela) #
  28. la $a0, prompt2 #carregando o endereço prompt para o registrador #
  29. syscall #imprime a string de prompt2 #
  30. li $v0, 5 #Especifica o serviço de leitura de inteiros(cód: 5) #
  31. syscall #Lê o numero, ele estará armazenado em $v0 #
  32. beq $v0, 5, fim #seleção 5 vai para fim de execução #
  33. bge $v0, 6, err #se for maior que 6 vai para rotina de erro #
  34. ble $v0, 0, err #se for menor que 0 vai para rotina de erro #
  35. move $t7,$v0 #salva informação de operador informado pelo usuário #
  36. #Obtem o primeiro termo##################################################################
  37. li $v0, 4 #Especifica o serviço de impressão (4 na tela) #
  38. la $a0, termo1l #carregando o endereço prompt para o registrador #
  39. syscall #imprime a string de prompt #
  40. li $v0, 6 #Especifica o serviço de leitura de inteiros(d: 5) #
  41. syscall #Lê o numero, ele estará armazenado em $v0 #
  42. mov.s $f1,$f0 #armazena o valor inserido pelo usuário #
  43. #Obtem o segundo termo###################################################################
  44. term2: li $v0, 4 #Especifica o serviço de impressão (4 na tela) #
  45. la $a0, termo2l #carregando o endereço prompt para o registrador #
  46. syscall #imprime a string de prompt #
  47. li $v0, 6 #Especifica o serviço de leitura de inteiros(d: 5) #
  48. syscall #Lê o numero, ele estará armazenado em $v0 #
  49. mov.s $f3,$f0 # armazena o valor inserido pelo usuário #
  50. #determina a operação####################################################################
  51. beq $t7, 1, soma #redireciona para sub-rotina de soma #
  52. beq $t7, 2, subt #redireciona para sub-rotina de subtração #
  53. beq $t7, 3, multi #redireciona para sub-rotina de multiplicação #
  54. beq $t7, 4, divi #redireciona para sub-rotina de divisão #
  55. soma: add.s $f5,$f3,$f1 #realiza a soma armazena em resultado #
  56. jal print #pula para impressão do resultado #
  57. subt: sub.s $f5, $f3,$f1 #armazena em $t2 o resultado de $t0 - $t1 #
  58. jal print #pula para impressão do resultado #
  59. multi: mul.s $f5, $f3, $f1 #armazena em $t2 o resultado de $t0 * $t1 #
  60. jal print #pula para impressão do resultado #
  61. divi: c.eq.s $f3,$f10 #se $f3=$f10 então flag 0 do coproc1 true #
  62. bc1t errdiv # pula caso flag 0 do coproc1 seja true #
  63. div.s $f5, $f3, $f1 #armazena em $t2 o resultado de $t0 / $t1 #
  64. jal print #pula para impressão do resultado #
  65. #Fim de Rotina###########################################################################
  66. #impressão na tela do resultado##########################################################
  67. print: li $v0,31 #parametro para a execução de som MIDI #
  68. la $a0, 70 #Carrega a nota musical no registrador #
  69. la $a1, 1000 #Tempo em milissegundos #
  70. la $a2, 0 #código do instrumento #
  71. la $a3, 127 #volume #
  72. syscall #executa o som #
  73. li $v0,4 #Especifica o serviço de impressão (4) #
  74. la $a0, resultadol #carrega a String no registrador #
  75. syscall #faz a chamada do sistema #
  76. li $v0,2 #Especifica o serviço de impressão de inteiro (3) #
  77. mov.s $f12, $f5 #carrega no registrador o numero a ser exibido #
  78. syscall #faz a chamada no sistema #
  79. li $v0,4 #Especificando o serviço de impressão de String #
  80. la $a0, pulalinha #Carrega a String para o registrado #
  81. syscall #faz a chamada de sistema #
  82. jal pr #vai para a rotina de prompt de menu #
  83. #Fim da Sub-rotina#######################################################################
  84. #Sub-rotina de erro de dividendo =0######################################################
  85. errdiv: li $v0,31 #parametro para a execução de som MIDI #
  86. la $a0, 61 #Carrega a nota musical no registrador #
  87. la $a1, 1000 #Tempo em milissegundos #
  88. la $a2, 7 #código do instrumento #
  89. la $a3, 127 #volume #
  90. syscall #executa o som #
  91. li $v0, 4 #Especifica o serviço de impressão (4) #
  92. la $a0, diveerr #carregando o endereço final para o registrador #
  93. syscall #imprime a string de prompt #
  94. jal term2 #retorna a pedir o segundo termo da divisão #
  95. #Sub-Rotina de erro de inserção##########################################################
  96. err: li $v0,31 #parametro para a execução de som MIDI #
  97. la $a0, 61 #Carrega a nota musical no registrador #
  98. la $a1, 1000 #Tempo em milissegundos #
  99. la $a2, 7 #código do instrumento #
  100. la $a3, 127 #volume #
  101. syscall #executa o som #
  102. li $v0, 4 #Especifica o serviço de impressão (4 na tela) #
  103. la $a0, erro #carregando o endereço prompt para o registrador #
  104. syscall #imprime a string de prompt #
  105. jal pr #retorna para pr: #
  106. #Fim Sub-Rotina Err######################################################################
  107. #Sub-Rotina de Finalização de execução###################################################
  108. fim: li $v0, 4 #Especifica o serviço de impressão (4) #
  109. la $a0, final #carregando o endereço final para o registrador #
  110. syscall #imprime a string de prompt #
  111. li $v0, 10 #Carrega o serviço de finalização de execução (10) #
  112. syscall #Fim de execução #
  113. #Fim da Sub-rotina#######################################################################