IvoSilva

[LSDI] Multiplicação sem "mult"

Jan 28th, 2012
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.76 KB | None | 0 0
  1. # --------------------------------------------------------
  2. # Multiplicação de dois números sem usar o operando "mult"
  3. # Escrito por Ivo Lima da Silva --------------------------
  4. # --------------------------------------------------------
  5.  
  6. .data
  7.  
  8. menu: .asciiz "------ MENU -------------------------------------------------------------------\n 1 - Multiplicação (1) 2 - Multiplicação (2) 3 - Sair\nIntroduza a sua opção: "
  9. msg: .asciiz "Insira o número: "
  10. end: .asciiz "Fim de programa.\n"
  11. space: .asciiz " "
  12. crlf: .asciiz "\n"
  13.  
  14. .text
  15.  
  16. loop:
  17. la $a0, menu #Carrega a mensagem para a variável $a0 para depois imprimir ;
  18. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  19. syscall #Executa a ordem "avisada" anteriormente ;
  20.  
  21. li $v0, 5 #"Avisa" o computador que vai ler um número inteiro (que ficará em $v0) ;
  22. syscall #Excuta a ordem "avisada" anteriormente ;
  23.  
  24. 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 ;
  25. jal leitura #Executa a "função" leitura e retorna a esta linha ;
  26. jal multi1 #Executa a "função" multi1 e retorna a esta linha ;
  27. j loop #Salta para a linha de código 16 (loop) ;
  28.  
  29. entry1:
  30. 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 ;
  31. jal leitura #Executa a "função" leitura e retorna a esta linha ;
  32. jal multi2 #Executa a "função" multi2 e retorna a esta linha ;
  33. j loop #Salta para a linha de código 16 (loop) ;
  34.  
  35. entry2:
  36. bne $v0, 3, loop #Se $v0 não for igual a 3 então salta para a linha de código 16 (loop) . Caso seja igual prossegue ;
  37. j exit #Salta para a linha de código 92 (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 ;
  38.  
  39. leitura:
  40. la $a0, msg #Carrega a mensagem para a variável $a0 para depois imprimir ;
  41. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  42. syscall #Executa a ordem "avisada" anteriormente ;
  43.  
  44. li $v0, 5 #"Avisa" o computador que vai ler um número inteiro (que ficará em $v0) ;
  45. syscall #Executa a ordem "avisada" anteriormente ;
  46. move $a1, $v0 #Coloca o valor lido que está em $v0 em $a1 ;
  47.  
  48. la $a0, msg #Carrega a mensagem para a variável $a0 para depois imprimir ;
  49. li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
  50. syscall #Executa a ordem "avisada" anteriormente ;
  51.  
  52. li $v0, 5 #"Avisa" o computador que vai ler um número inteiro (que ficará em $v0) ;
  53. syscall #Executa a ordem "avisada" anteriormente ;
  54. move $a2, $v0 #Coloca o valor lido que está em $v0 em $a2 ;
  55.  
  56. jr $ra #Retorna à linha de código aonde esta função foi chamada ;
  57.  
  58. multi1:
  59. addi $t1, $zero, 32 #Inicializa a variável $t1 a 32 ;
  60. add $a0, $zero, $zero #Inicializa a variável $a0 a zero ;
  61. mloop:
  62. andi $t2, $a2, 1 #Coloca em $t2 o resultado da operação lógica AND entre $a2 (multiplicando) e 1 ;
  63. beqz $t2, somaZ #Salta para a linha de código 65 (SomaZ) caso $t2 seja igual a zero ;
  64. add $a0, $a0, $a1 #Soma a $a0 , $a1 unidades ;
  65. somaZ:
  66. sll $a1, $a1, 1 #Faz shift para a esquerda de $a1 uma unidade ;
  67. srl $a2, $a2, 1 #Faz shift para a direita de $a2 um unidade ;
  68. addi $t1, $t1, -1 #Subtrai a $t1 , uma unidade ;
  69. bnez $t1, mloop #Se $t1 não for igual a zero salta para linha de código 61 (mloop) ;
  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. jr $ra #Retorna à linha de código aonde esta função foi chamada ;
  79.  
  80. multi2:
  81. mult $a1, $a2 #Multiplica o valor de $a1 por $a2 metendo o produto em Hi e Lo ;
  82. mflo $a0 #Coloca o valor que está em Lo em $a0 ;
  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. exit:
  93. la $a0, end #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. # --------------------------------------------------------
  98. # FIM ----------------------------------------------------
  99. # --------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment