Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # --------------------------------------------------------
- # Multiplicação de dois números sem usar o operando "mult"
- # Escrito por Ivo Lima da Silva --------------------------
- # --------------------------------------------------------
- .data
- menu: .asciiz "------ MENU -------------------------------------------------------------------\n 1 - Multiplicação (1) 2 - Multiplicação (2) 3 - Sair\nIntroduza a sua opção: "
- msg: .asciiz "Insira o número: "
- end: .asciiz "Fim de programa.\n"
- space: .asciiz " "
- crlf: .asciiz "\n"
- .text
- loop:
- la $a0, menu #Carrega a mensagem para a variável $a0 para depois imprimir ;
- li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
- syscall #Executa a ordem "avisada" anteriormente ;
- li $v0, 5 #"Avisa" o computador que vai ler um número inteiro (que ficará em $v0) ;
- syscall #Excuta a ordem "avisada" anteriormente ;
- 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 ;
- jal leitura #Executa a "função" leitura e retorna a esta linha ;
- jal multi1 #Executa a "função" multi1 e retorna a esta linha ;
- j loop #Salta para a linha de código 16 (loop) ;
- entry1:
- 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 ;
- jal leitura #Executa a "função" leitura e retorna a esta linha ;
- jal multi2 #Executa a "função" multi2 e retorna a esta linha ;
- j loop #Salta para a linha de código 16 (loop) ;
- entry2:
- 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 ;
- 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 ;
- leitura:
- la $a0, msg #Carrega a mensagem para a variável $a0 para depois imprimir ;
- li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
- syscall #Executa a ordem "avisada" anteriormente ;
- li $v0, 5 #"Avisa" o computador que vai ler um número inteiro (que ficará em $v0) ;
- syscall #Executa a ordem "avisada" anteriormente ;
- move $a1, $v0 #Coloca o valor lido que está em $v0 em $a1 ;
- la $a0, msg #Carrega a mensagem para a variável $a0 para depois imprimir ;
- li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
- syscall #Executa a ordem "avisada" anteriormente ;
- li $v0, 5 #"Avisa" o computador que vai ler um número inteiro (que ficará em $v0) ;
- syscall #Executa a ordem "avisada" anteriormente ;
- move $a2, $v0 #Coloca o valor lido que está em $v0 em $a2 ;
- jr $ra #Retorna à linha de código aonde esta função foi chamada ;
- multi1:
- addi $t1, $zero, 32 #Inicializa a variável $t1 a 32 ;
- add $a0, $zero, $zero #Inicializa a variável $a0 a zero ;
- mloop:
- andi $t2, $a2, 1 #Coloca em $t2 o resultado da operação lógica AND entre $a2 (multiplicando) e 1 ;
- beqz $t2, somaZ #Salta para a linha de código 65 (SomaZ) caso $t2 seja igual a zero ;
- add $a0, $a0, $a1 #Soma a $a0 , $a1 unidades ;
- somaZ:
- sll $a1, $a1, 1 #Faz shift para a esquerda de $a1 uma unidade ;
- srl $a2, $a2, 1 #Faz shift para a direita de $a2 um unidade ;
- addi $t1, $t1, -1 #Subtrai a $t1 , uma unidade ;
- bnez $t1, mloop #Se $t1 não for igual a zero salta para linha de código 61 (mloop) ;
- li $v0, 1 #"Avisa" o computador que vai imprimir um valor inteiro ;
- syscall #Executa a ordem "avisada" anteriormente ;
- li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
- la $a0, crlf #Carrega a mensagem para a variável $a0 para depois imprimir ;
- syscall #Executa a ordem "avisada" anteriormente ;
- jr $ra #Retorna à linha de código aonde esta função foi chamada ;
- multi2:
- mult $a1, $a2 #Multiplica o valor de $a1 por $a2 metendo o produto em Hi e Lo ;
- mflo $a0 #Coloca o valor que está em Lo em $a0 ;
- li $v0, 1 #"Avisa" o computador que vai imprimir um valor inteiro ;
- syscall #Executa a ordem "avisada" anteriormente ;
- li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
- la $a0, crlf #Carrega a mensagem para a variável $a0 para depois imprimir ;
- syscall #Executa a ordem "avisada" anteriormente ;
- jr $ra #Retorna à linha de código aonde esta função foi chamada ;
- exit:
- la $a0, end #Carrega a mensagem para a variável $a0 para depois imprimir ;
- li $v0, 4 #"Avisa" o computador que vai imprimir uma string ;
- syscall #Executa a ordem "avisada" anteriormente ;
- # --------------------------------------------------------
- # FIM ----------------------------------------------------
- # --------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment