[LSDI] Divisão sem "div"

By: IvoSilva on Jan 28th, 2012  |  syntax: None  |  size: 5.92 KB  |  hits: 64  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  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. # --------------------------------------------------------