Red de conocimiento informático - Material del sitio web - Hay 100 números sin signo en la memoria, con DAT como primera dirección. Programe para calcular el número de números primos entre ellos y muestre el resultado en la pantalla en forma de número decimal.

Hay 100 números sin signo en la memoria, con DAT como primera dirección. Programe para calcular el número de números primos entre ellos y muestre el resultado en la pantalla en forma de número decimal.

.model pequeño

.stack 400h

.data

ttl db 13, 10, 10, 'Número total de números primos: $'

diez dw 10

pcount db 0

dat dw 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

dw 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

dw 21, 22, 23, 24, 25, 26, 27, 28, 29, 30

dw 31, 32, 33, 34, 35, 36.37, 38, 39, 40

Alemán 41, 42, 43, 44, 45, 46, 47, 48, 49, 50

Alemán 51, 52, 53, 54, 55, 56, 57, 58, 59, 60

Alemán 61, 62, 63, 64, 65, 66, 67, 68, 69, 70

p>dw 71, 72, 73, 74, 75, 76, 77, 78, 79, 80

dw 81, 82, 83, 84, 85, 86, 87, 88, 89, 90

dw 91, 92, 93, 94, 95, 96, 97, 98, 99, 100

. >

main: mov ax, @data

mov ds, ax

lea si, dat

mov di, 100; para eficiencia

cld

m_1: lodsw; toma un entero sin signo de ds:si a ax

.llama a isprime

jnc m_2

inc pcount

llame a printax; si es un número primo, genere el número decimal de ax

mov dl, 9 separado por tabulaciones

call putc

m_2: dec di

jnz m_1; ¿Se han completado los 100 números?

mov dx, offset ttl; genera el número total de números primos

call puts

mov al, pcount;

xor ah, ah

llamar a printax

mov ah, 4ch

int 21h

isprime proc

test ax, 1; ¿Es par?

jnz ip_1; Si es par, regresa directamente

ip_0: clc=0 significa número par

ret

p>

ip_1: cmp ax, 1;

jbe ip_0; no es primo

cmp ax, 3

je ip_4; bucle desde 3

ip_2:mov

bx, ax; dejar una copia en bx

xor dx, dx; borrar dx para la división

div cx

mov ax, bx; ax

o dx, dx; resto 0 no

jz ip_0; para 0 es el número de combinaciones

suma cx, se suma 3; por 2, solo cuando el divisor de prueba es un número impar, se puede sumar 3 directamente para comparar si el número de cx y ax es ax-1

p> cmp cx, ax

jb ip_3; si cx es mayor o igual que ax, indica que el dividendo se ha intentado para n-1 y ax es un número primo, regresa directamente, de lo contrario continúa con ip_3

ip_4: stc ; CF=1 significa que es un número primo

ret

ip_3: dec cx-1 es el divisor real. prueba el siguiente divisor

jmp ip_2; sigue intentándolo

isprime endp

pone proc

mov ah, 9

int 21h

ret

pone endp

putc proc

mov ah, 2

int 21h

ret

putc endp

printax proc

xor dx, dx

div ten

mov cx, ax

o cx, dx si el cociente y el resto son 0, finaliza la recursividad

xor dx, dx

div ten

mov cx, ax

o cx, dx si el cociente y el resto son 0, finaliza la recursividad