Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

[AYUDA] con MASM

batiguason_11

Bovino adicto
Desde
27 Jun 2009
Mensajes
703
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 :)
 
No me acuerdo de las instrucciones del ensamblador y tampoco tengo un compilador a mano para determinar en que te "falla" cuando decís que el registro DX no guarda el residuo cuando realizas la división de BX con 5.

Sin embargo, creo que la solución no esta bien planteada de por si. Por ejemplo, si yo pruebo dicho programa con el número 4, 4/1, residuo 0, con=1, luego 4/2, residuo 0, con=2, luego 4/3, residuo 1, con = 2, luego 4/5, residuo 5, con = 2, luego 4/7, residuo 7, con =2 y salto a PRI y lo declaro primo. Sin embargo, 4 no es primo, ya que un número primo solo es divisible dentro de 1 y el mismo.

Yo haría lo siguiente:

1. Comparar si el numero es 1,2,3,5, o 7. Si es así, saltar a PRI (con un JMP PRI).

2. Luego,

Dividir dentro de 2
CMP DX,0
JZ NP

Dividir dentro de 3
CMP DX,0
JZ NP

Dividir dentro de 5
CMP DX,0
JZ NP

Dividir dentro de 7
CMP DX,0
JZ NP

PRI

Esto funciona ya que si el dígito no es 1,2,3,5,7, media vez sea divisible dentro de uno de estos, ya no es primo, y no vale la pena seguir comparando, por lo que saltamos a NP, en caso no sean divisibles seguimos dividiendo y comparando el residuo hasta llegar a 7, y si no es divisible dentro de este, entonces pasamos a PRI directamente.

Ahora, probemos el ejemplo que puse. Para 4, 4 no es 1,2,3,5,7, así que lo dividimos con 2. Como DX=0 para 4/2, saltamos directamente a NP, diciendo que no es primo.

Espero que esto te pueda ayudar.
Saludos
 
Volver
Arriba