
04/07/2010, 13:30
|
| | Fecha de Ingreso: marzo-2010
Mensajes: 10
Antigüedad: 15 años Puntos: 0 | |
MASM números primos[ayuda] Veran estoy haciendo un programa en MASM que me dice si un número es primero, pero al momento de dividir el número entre 5 falla algo, no me guarda el residuo correctamente en dx, me podrian ayudar por favor :) el programa divide el número entre 2,3,5 y 7 y según un contador me dice si es primo o no, si el contador es igual a 3 ya no es primo.
Código:
DATOS SEGMENT PARA PUBLIC 'DATA'
PRIMO DB 'Es primo',0AH,0Dh,'$'
NPRIMO DB 'No es primo',0AH,0DH,'$'
ERROR DB 'Solo acepto digitos',0AH,0DH,'$'
CON DB 0
DATOS ENDS
PILA SEGMENT PARA STACK 'STACK'
DB 64 DUP (0)
PILA ENDS
CODIGO SEGMENT PARA PUBLIC 'CODE'
ASSUME DS:DATOS,SS:PILA,CS:CODIGO
MAIN PROC FAR
INI:PUSH DS
SUB AX,AX
PUSH AX
MOV CON,0
LEE:MOV AH,01
INT 21H ;LEEMOS 1 DIGITO
SUB AL,30H ;COMPROBAMOS SI ES
CMP AL,0AH ;NUMERO O CARACTER
JL CONVER ;FUE DIGITO
MOV AX,DATOS;IMPRIME MSG ERROR
MOV DS,AX
MOV DX,OFFSET ERROR
CALL IMPRIME
JG LEE ;FUE CARACTER
CONVER:MOV AH,00 ;ES CERO?
CMP AL,0
JZ CERO1 ;FUE CERO NO CONVERTIMOS
MOV CX,0008
SHL AX,CL
CERO1:MOV BX,AX ;COLOCAMOS EL PRIMER DIGITO
LEE1:MOV AH,01
INT 21H
SUB AL,30H
CMP AL,0AH
JLE DIGIT
MOV AX,DATOS
MOV DS,AX
MOV DX,OFFSET ERROR
CALL IMPRIME
JG LEE1
DIGIT:MOV AH,00
CMP AL,0
JZ CERO2
MOV CX,0004
SHL AL,CL
CERO2:ADD BX,AX
LEE2:MOV AH,01
INT 21H
SUB AL,30H
CMP AL,0AH
JL DIGIT1
MOV AX,DATOS
MOV DS,AX
MOV DX,OFFSET ERROR
CALL IMPRIME
DIGIT1:MOV AH,00
ADD BX,AX
MOV AX,BX
PUSH BX
MOV BX,0001
DIV BX
CMP DX,0000 ;ES MULTIPLO DE 1?
JG M2
INC CON
M2:POP BX
MOV AX,BX
PUSH BX
MOV BX,0002
DIV BX
CMP DX,0000 ;ES MULTIPLO DE 2?
JG M3
INC CON
M3:POP BX
MOV AX,BX
PUSH BX
MOV BX,0003
DIV BX
CMP DX,0000 ;ES MULTIPLO DE 3?
JG M5
INC CON
CMP CON,03
JZ NP
M5:POP BX
MOV AX,BX
PUSH BX
MOV BX,0005
DIV BX
CMP DX,0000 ;ES MULTIPLO DE 5?
JG M7
INC CON
MOV AL,CON
CMP AL,03
JZ NP
M7:POP BX
MOV AX,BX
PUSH BX
MOV BX,0007
DIV BX
CMP DX,0000 ;ES MULTIPLO DE 7?
JG PRI
INC CON
MOV AL,CON
CMP AL,03
JZ NP
PRI:MOV AX,DATOS
MOV DS,AX
MOV DX,OFFSET PRIMO
CALL IMPRIME
JG FIN
NP:MOV AX,DATOS
MOV DS,AX
MOV DX,OFFSET NPRIMO
CALL IMPRIME
FIN:RET
MAIN ENDP
IMPRIME PROC NEAR
MOV AH,09
INT 21H
MOV AH,00
RET
IMPRIME ENDP
CODIGO ENDS
END INI
Gracias por la ayuda que me puedan dar :) |