- # --------------------------------------------------------
- # Divisão de dois números sem usar o operando "div" ------
- # Escrito por Ivo Lima da Silva --------------------------
- # --------------------------------------------------------
- .data
- menu: .asciiz "------ MENU -------------------------------------------------------------------\n 1 - Divisão (1) 2 - Divisão (2) 3 - Sair\nIntroduza a sua opção: "
- msg: .asciiz "Insira o número: "
- q: .asciiz "Quociente: "
- r: .asciiz "Resto: "
- 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 div1 #Executa a "função" div1 e retorna a esta linha ;
- j loop #Salta para a linha de código 18 (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 div2 #Executa a "função" div2 e retorna a esta linha ;
- j loop #Salta para a linha de código 18 (loop) ;
- entry2:
- 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 ;
- 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 ;
- 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 ;
- div1:
- la $a0, q #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 ;
- add $a0, $zero, $zero #Inicializa a variável $a0 a zero ;
- dloop:
- sub $a1, $a1, $a2 #Subtrai a $a1 , $a2 unidades ;
- addi $a0, $a0, 1 #Soma a $a0 , 1 unidade ;
- bge $a1, $a2, dloop #Se $a1 for maior ou igual a $a2 salta para linha de código 66 (dloop) ;
- 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 ;
- la $a0, r #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 ;
- move $a0, $a1
- 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 ;
- div2:
- la $a0, q #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 ;
- div $a1, $a2 #Divide o valor de $a1 por $a2 metendo o quociente em Lo e o resto em Hi ;
- 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 ;
- la $a0, r #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 ;
- mfhi $a0 #Coloca o valor que está em Hi 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 ----------------------------------------------------
- # --------------------------------------------------------

