Números primos

Programa que halla los numeros primos hasta n:

 

Bajelo Aca ya listo para el Simulador: primos.zip

 

El algoritmo para hallar los numeros primos es el siguiente:

PROGRAMA

leo limite

num=1

MQ num<=limite Haga

    Si num<=3

        Imprima Num

    Sino Si num % 2 == 0

                Break

            Sino

                x=3

                raiz=RaizC(num)

                MQ x<=raiz Haga

                    Si num % x ==0 break SI

                    x= x+2

                FinMQ

                imprima num

            FinSi

    FinSi

num=num+1

FinMQ

FIN PROGRAMA

//Programa Numeros Primos

//Leo el limite o valor hasta donde quiero hallar numeros primos

//inicializo num en 1

//Repito este bucle hasta que num > limite

//Si el modulo de num/2 = 0 es porque el numero es par.

//aca RaizC() es la funcion que se explica mas adelante.

Funcion RaizC()

y=1

mq (y != raiz) ó (y != raiz+1) haga

    raiz = y

    y = ( y + ( num / y )) / 2

fin mq

Funcion para hallar la raiz cuadrada de un numero

//inicializo y en 1

//Hago un Bucle que no termine hasta que "y" sea diferente de raiz o raiz+1

Ahora para escribirlo en assembler organizare la memoria del simulador asi:

 

Variable

limite

num

x

raiz

y

2

3

0

1

Dirección Memoria

34

35

36

37

38

3A

3B

3C

3D

Descripcion

Limite hasta donde quiero que lleguen los primos

empieza en 1 y termina cuando llega a limite

variable usada para hallar si el numero es primo

variable raiz, almacena la raiz de num

variable usada en RaizC()

Constante numero 2  (en binario 10)

Constante numero 3  (en binario 11)

Constante numero 0  (en binario 0)

Constante numero 1  (en binario 1)

Ahora pasemos ese Algoritmo a Assembler, al frente de cada instrucción esta comentado despues del punto y coma que hace esta.

El programa quedaria asi:

Dir

00: 

01: 

02: 

03: 

04: 

05: 

06: 

07: 

08: 

09: 

0A: 

0B: 

0C: 

0D: 

0E: 

0F: 

10: 

11: 

12: 

13: 

14: 

15: 

16: 

17: 

18: 

19: 

1A: 

1B: 

1C: 

1D: 

1E: 

1F: 

20: 

21: 

22: 

23: 

24: 

25: 

26: 

27: 

28: 

29: 

2A: 

2B: 

2C: 

2D: 

2E: 

2F: 

30: 

31: 

32: 

33: 

34: 

35: 

36: 

37: 

38: 

39: 

3A: 

3B: 

3C: 

3D: 

3E: 

3F: 

40: 

Instrucción y Parámetros

NOP

MOV 35,3D

LDT

MOV 34,AX

MOV AX,34

CMP 35

JME 32

MOV AX,35

CMP 3B

JMA D

MOV AX,35

EAP

JMP 30

MOV AX,35

DIV 3A

MOV AX,BX

CMP 3C

JMA 13

JMP 30

MOV 36,3B

MOV 38,3D

MOV AX,38

CMP 37

JEQ 23

MOV AX,37

INC AX

CMP 38

JEQ 23

MOV 37,38

MOV AX,35

DIV 38

ADD 38

DIV 3A

MOV 38,AX

JMP 15

MOV AX,37

CMP 36

JME 2E

MOV AX,35

DIV 36

MOV AX,BX

CMP 3C

JEQ 30

INC 36

INC 36

JMP 23

MOV AX,35

EAP

INC 35

JMP 04

HLT

10

10

11

0

1

Comentarios

;No operacion

;num = 1

;leo del teclado el Limite

;almaceno limite en 34

;cargo limite en AX (Comienzo MQ)

;comparo limite con num

;Si limite es menor que num voy a fin de MQ

;AX=num

;comparo num con 3

;si num > 3 voy a SINO

;AX = num

;Escribo num en pantalla

;voy a FINSI

;AX=num SINO

;AX = AX/2 , BX = modulo

;paso el modulo a AX

;comparo mod con 0 

;salto si mod > 0

;break

;x=3

;y=1

;cargo Y en AX (COMIENZO MQ del raiz())

;comparo y con raiz

;si y=raiz salgo del mq

;AX=raiz

;AX=AX+1

;comparo raiz con y

;si raiz=y salgo del mq

;raiz = y

;AX = num

;AX = num/y

;AX = AX + Y

;AX = AX / 2

;y = al valor del Registro AX

;Salto a repetir el blucle MQ del raizC()

;FINMQraiz()  y  AX = raiz     (COMIENZO MQ2)

;comparo raiz con y

;si raiz < x voy a fin MQ2

;AX = num

;AX = AX / x

;AX = residuo que esta en BX

;Comparo residuo con 0

;si residuo = 0 salgo del SI

;x= x+1

;x= x+1

;voy a MQ2

;AX = num       FIN MQ2

;imprimo num en pantalla

;FINSI

;hago loop

;FIN MQ y PROGRAMA

;Inicializo raiz en 2

;Con el editor de memoria del simulador almaceno las constantes

;Constante 2

;Constante 3

;Constante 0

;Constante 1