IvoSilva

[LSDI] Divisão sem "div"

Jan 28th, 2012
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. # --------------------------------------------------------
  2. # Divisão de dois números sem usar o operando "div" ------
  3. # Escrito por Ivo Lima da Silva --------------------------
  4. # --------------------------------------------------------
  5.  
  6. .data
  7.  
  8. menu: .asciiz "------ MENU -------------------------------------------------------------------\n 1 - Divisão (1) 2 - Divisão (2) 3 - Sair\nIntroduza a sua opção: "
  9. msg: .asciiz "Insira o número: "
  10. q: .asciiz "Quociente: "
  11. r: .asciiz "Resto: "
  12. end: .asciiz "Fim de programa.\n"
  13. space: .asciiz " "
  14. crlf: .asciiz "\n"
  15.  
  16. .text
  17.  
  18. loop:
  19. la $a0, menu #Carrega a mensagem para a variável $a0 para depois imprimir ;
  20. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  21. syscall #Executa a ordem "avisada" anteriormente ;
  22.  
  23. li $v0, 5 #"Avisa" o computador que vai ler um número inteiro (que ficará em $v0) ;
  24. syscall #Excuta a ordem "avisada" anteriormente ;
  25.  
  26. bne $v0, 1, entry1 #Se $v0 não for igual a 1 então salta para a linha de código 29 (entry1) . Caso seja igual prossegue ;
  27. jal leitura #Executa a "função" leitura e retorna a esta linha ;
  28. jal div1 #Executa a "função" div1 e retorna a esta linha ;
  29. j loop #Salta para a linha de código 18 (loop) ;
  30.  
  31. entry1:
  32. bne $v0, 2, entry2 #Se $v0 não for igual a 2 então salta para a linha de código 35 (entry2) . Caso seja igual prossegue ;
  33. jal leitura #Executa a "função" leitura e retorna a esta linha ;
  34. jal div2 #Executa a "função" div2 e retorna a esta linha ;
  35. j loop #Salta para a linha de código 18 (loop) ;
  36.  
  37. entry2:
  38. bne $v0, 3, loop #Se $v0 não for igual a 3 então salta para a linha de código 18 (loop) . Caso seja igual prossegue ;
  39. j exit #Salta para a linha de código 120 (exit) . De notar que esta função não retorna a esta linha e a "função" exit não tem jr logo terá que ficar no final do progama ;
  40.  
  41. leitura:
  42. la $a0, msg #Carrega a mensagem para a variável $a0 para depois imprimir ;
  43. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  44. syscall #Executa a ordem "avisada" anteriormente ;
  45.  
  46. li $v0, 5 #"Avisa" o computador que vai ler um número inteiro (que ficará em $v0) ;
  47. syscall #Executa a ordem "avisada" anteriormente ;
  48. move $a1, $v0 #Coloca o valor lido que está em $v0 em $a1 ;
  49.  
  50. la $a0, msg #Carrega a mensagem para a variável $a0 para depois imprimir ;
  51. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  52. syscall #Executa a ordem "avisada" anteriormente ;
  53.  
  54. li $v0, 5 #"Avisa" o computador que vai ler um número inteiro (que ficará em $v0) ;
  55. syscall #Executa a ordem "avisada" anteriormente ;
  56. move $a2, $v0 #Coloca o valor lido que está em $v0 em $a2 ;
  57.  
  58. jr $ra #Retorna à linha de código aonde esta função foi chamada ;
  59.  
  60. div1:
  61. la $a0, q #Carrega a mensagem para a variável $a0 para depois imprimir ;
  62. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  63. syscall #Executa a ordem "avisada" anteriormente ;
  64.  
  65. add $a0, $zero, $zero #Inicializa a variável $a0 a zero ;
  66. dloop:
  67. sub $a1, $a1, $a2 #Subtrai a $a1 , $a2 unidades ;
  68. addi $a0, $a0, 1 #Soma a $a0 , 1 unidade ;
  69. bge $a1, $a2, dloop #Se $a1 for maior ou igual a $a2 salta para linha de código 66 (dloop) ;
  70.  
  71. li $v0, 1 #"Avisa" o computador que vai imprimir um valor inteiro ;
  72. syscall #Executa a ordem "avisada" anteriormente ;
  73.  
  74. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  75. la $a0, crlf #Carrega a mensagem para a variável $a0 para depois imprimir ;
  76. syscall #Executa a ordem "avisada" anteriormente ;
  77.  
  78. la $a0, r #Carrega a mensagem para a variável $a0 para depois imprimir ;
  79. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  80. syscall #Executa a ordem "avisada" anteriormente ;
  81.  
  82. move $a0, $a1
  83. li $v0, 1 #"Avisa" o computador que vai imprimir um valor inteiro ;
  84. syscall #Executa a ordem "avisada" anteriormente ;
  85.  
  86. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  87. la $a0, crlf #Carrega a mensagem para a variável $a0 para depois imprimir ;
  88. syscall #Executa a ordem "avisada" anteriormente ;
  89.  
  90. jr $ra #Retorna à linha de código aonde esta função foi chamada ;
  91.  
  92. div2:
  93. la $a0, q #Carrega a mensagem para a variável $a0 para depois imprimir ;
  94. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  95. syscall #Executa a ordem "avisada" anteriormente ;
  96.  
  97. div $a1, $a2 #Divide o valor de $a1 por $a2 metendo o quociente em Lo e o resto em Hi ;
  98. mflo $a0 #Coloca o valor que está em Lo em $a0 ;
  99. li $v0, 1 #"Avisa" o computador que vai imprimir um valor inteiro ;
  100. syscall #Executa a ordem "avisada" anteriormente ;
  101.  
  102. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  103. la $a0, crlf #Carrega a mensagem para a variável $a0 para depois imprimir ;
  104. syscall #Executa a ordem "avisada" anteriormente ;
  105.  
  106. la $a0, r #Carrega a mensagem para a variável $a0 para depois imprimir ;
  107. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  108. syscall #Executa a ordem "avisada" anteriormente ;
  109.  
  110. mfhi $a0 #Coloca o valor que está em Hi em $a0 ;
  111. li $v0, 1 #"Avisa" o computador que vai imprimir um valor inteiro ;
  112. syscall #Executa a ordem "avisada" anteriormente ;
  113.  
  114. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  115. la $a0, crlf #Carrega a mensagem para a variável $a0 para depois imprimir ;
  116. syscall #Executa a ordem "avisada" anteriormente ;
  117.  
  118. jr $ra #Retorna à linha de código aonde esta função foi chamada ;
  119.  
  120. exit:
  121. la $a0, end #Carrega a mensagem para a variável $a0 para depois imprimir ;
  122. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  123. syscall #Executa a ordem "avisada" anteriormente ;
  124.  
  125. # --------------------------------------------------------
  126. # FIM ----------------------------------------------------
  127. # --------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment