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.
.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