Advertisement
Guest User

Numeros Primos em Assembly MIPS

a guest
Nov 23rd, 2017
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #CODIGO ABAIXO - EXECUTADO EM PCSPIM OU MARS
  2. .data
  3.  
  4.     msg0:.asciiz"\n-----Descubra os numeros Primos-----"
  5.     msg1:.asciiz"\nDigite um numero entre 1 e 100000: "
  6.     msg2:.asciiz"\nVoce digitou um numero invalido"
  7.     msg3:.asciiz"\nEstes numeros sao primos:\n"
  8.     espaco:.asciiz"\n"
  9.  
  10. .text
  11. .globl main
  12.  
  13. main:
  14.     #------------- DEFINIÇÃO DAS ROTINAS DE EXECUÇÃO ----------------------
  15.     jal ler         #Salto para a leitura inicial do programa
  16.  
  17.     li $t0, 2       #dividir por 2 ate o valor digitado
  18.     li $t7, 0       #comparar com 0
  19.     li $s0, 1       #atribui o ponto de inicio de contagem
  20.  
  21.     jal verifica    #Salto para a verficação dos valores primos
  22.  
  23.     j fim           #finaliza o programa
  24.  
  25.     voltar:         #volta para o endereço passado por ra
  26.  
  27.     jr $ra          #pula para ra
  28.  
  29.    
  30.     #----------- CORPO PRINCIPAL DE EXECUÇÃ0 - INICIO -------------------
  31.     ler:
  32.     #---------- CABECALHO DO PROGRAMA - APRESENTACAO --------------------
  33.         #escreval("-----Descuba os numeros Primos-----")
  34.         li $v0, 4               #$v0 recebe 4
  35.         la $a0, msg0            #$a0 recebe mensagem
  36.         syscall                 #Chamada de sistema
  37.        
  38.         #--------- LE O VALOR INFORMADO PELO USUARIO ----------
  39.         inicio:
  40.             #escreval("Digite um numero entre 1 e 100000")
  41.             li $v0, 4               #$v0 recebe 4
  42.             la $a0, msg1                #$a0 recebe mensagem
  43.             syscall                 #Chamada de sistema
  44.  
  45.             # $t0 - sera usado para armazenar o valor inicial
  46.             #Aqui ficara o valor informado pelo usuario
  47.             li $v0, 5               #$v0 recebe 5
  48.             syscall                 #chamada de sistema
  49.             add $s1, $v0, $zero     #$s1 recebe $v0 + 0 sendo $s1 = valor digitado
  50.            
  51.            
  52.         # ----------- TESTE VERIFICA VALOR DIGITADO -----------
  53.            
  54.         #Se (numero >= 100001) entao
  55.         #Enquanto o valor for maior que 100000 ira ser reiniciado
  56.         bge $s1, 100001, semaior        #$s1 >= 100001 segue para label semaior
  57.         j testemenor                    #Caso contrario pula para label testemenor
  58.            
  59.         semaior:
  60.             li $v0, 4           #$v0 recebe 4
  61.             la $a0, msg2        #$a0 recebe mensagem
  62.             syscall             #Chamada de sistema
  63.         j inicio                #pula para label inicio
  64.            
  65.         #Se (numero <= 1) entao
  66.         #Enquanto o valor for menor que 1 ira ser reiniciado
  67.         testemenor:
  68.             ble $s1, 1, semenor         #$s1 <= 1 segue para label semenor
  69.             j segueapp                  #Caso contrario pula para label segueapp
  70.            
  71.         semenor:
  72.             li $v0, 4           #$v0 recebe 4
  73.             la $a0, msg2        #$a0 recebe mensagem
  74.             syscall             #Chamada de sistema
  75.         j inicio                #pula para label inicio
  76.            
  77.         #----------- FIM DE TESTE VERIFICA VALOR -------------       
  78.            
  79.         segueapp:
  80.            
  81.             li $v0, 4           #$v0 recebe 4
  82.             la $a0, msg3        #$a0 recebe mensagem
  83.             syscall             #Chamada de sistema
  84.     #--------------------- FINALIZA O CORPO PRINCIPAL -------------------------
  85.  
  86.     j voltar    #pula para o voltar
  87.  
  88.     #------------- PERCORRE OS VALORES VERIFICANDO OS PRIMOS --------------
  89.     percorre:
  90.  
  91.         bge $s0, $s1, voltar    #$s0 >= $s1 segue para label voltar
  92.         addi $s0, $s0, 1        #adiciona + 1 ao valor de $s0
  93.  
  94.         li $t0, 2               #atribui 2 ao valor de $t0
  95.         j verifica              #pula para o modo de verificacao
  96.  
  97.     #------------ FAZ OS CALCULOS PARA ENCONTRAR OS PRIMOS ---------------
  98.     verifica:
  99.  
  100.         div $s0, $t0                #realiza a divisão dos valores
  101.         mfhi $t2                    #move para o registrador $t2
  102.  
  103.         beq $t2, $t7, percorre      #verifica se $t2 e maior ou igual a $t7
  104.                                     #se for, retorna ao label percorre
  105.         addi $t0, $t0, 1            #adiciona + 1 ao valor de $t0
  106.        
  107.         bge $t0, $s0, primo     #verifica se o valor de $t0 é maior que $s0
  108.                                 #se for, pula para o label primo
  109.  
  110.         j verifica              #realiza o jump de acesso em loop
  111.  
  112.     #--------- IMPRIME OS VALORES ENCONTRADOS PRIMOS -------------------
  113.     primo:
  114.  
  115.         la $a0, espaco          #atribui a mensagem espaco
  116.         li $v0, 4               #imprime um salto de linha
  117.         syscall                 #chamada de sistema
  118.  
  119.         add $a0, $s0, $zero     #atribui o valor para impressão
  120.         li $v0, 1               #imprime o valor primo
  121.         syscall                 #chamada de sistema
  122.  
  123.     j percorre      #Volta para verificação de valores
  124.  
  125.     #-------------- ENCERRAMENTO DO SISTEMA GERAL ---------------------
  126.     fim:
  127.         li $v0, 10      #finaliza o sistema
  128.         syscall         #chamada de sistema
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement