Programma asm con errorino :)

di il
1 risposte

Programma asm con errorino :)

Questo è il mio programma in asembler
Il programma una volta inserita la password la richiede per conferma è controlla se è stata re-inserita correttamente. Nel caso in cui la seconda volta in cui si inserisce la password no sia uguale alla prima deve avvertire l'utente. La pass deve avere minimo 8 caratteri.
Il problema è che mi da sempre pass non corretta :/ qualche aiuto ?

.model small
.stack
.data

inserisci db "Inserisci password: $"
reInserisci db "Inserisci nuovamente la password: $"
ok db "Password accettata !!! $"
nonOk db " Password non accettata $"

.code
program:

inserCar macro ;
mov dl,"*" ; marco per scrittura "*"
mov ah,02h ;
int 21h ;
endm

leggiCar macro ;
mov ah,07h ; macro per lettura carattere
int 21h ;
endm

nuovaRiga macro ;
mov dl,0ah ;
mov ah,02h ; macro per nuova riga
int 21h ;
mov dl,0dh ;
int 21h ;
endm

mov ax,@data
mov ds,ax

mov ds:[400d],00d ; in questo inderizzo salverò il numero di caratteri inseriti
jmp inizio
nonAccettato:
lea dx,nonOK ; scrive " Password non accettata"
mov ah,09h
int 21h
nuovaRiga
inizio:
mov bx,180d ; bx <- 180d
lea dx,inserisci ; scrive "Inserisci password:"
mov ah,09h
int 21h
leggiAvanti: leggiCar ; lettura carattere
cmp al,13d ; carattere inserito == enter ?
jz avantiFine ; se si salto avantiFine
mov ds:[bx],al ; ds:[bx] <- al
inc bx ; bx ++
inc byte ptr ds:[400d] ; carattere inserito ++
inserCar ; macro
jnz leggiAvanti ; se non enter ripeti
avantiFine: cmp bx,188d ; bx < 188 ? quindi la pass ha meno di 8 caratteri ?
js nonAccettato ; se si salto nonAccettato, altrimenti continua
nuovaRiga
lea dx,reInserisci ; scrive "Inserisci nuovamente la password:"
mov ah,09h
int 21h
mov bx,210d ; bx <- 210d
controllaAvanti: leggiCar ; macro per lettura carattere
cmp al,13d ; carattere == enter ?
jz quasiFine ; se si salto quasiFine
mov ds:[bx],al ; ds:[bx] <- al
inc bx ; bx ++
inserCar ; macro
jnz controllaAvanti ; se non e enter salto controllaAvanti
quasiFine:
mov si,180d ; si <- 210d
mov cx,ds:[400d] ; cx <- num. di caratteri inseriti
ZA : ; for
mov ah,ds:[si] ; ah <- ds:[si]
cmp ds:[si+30d],ah ; ds:[si+30d] == ah
inc si ; si ++
jnz nonAccettato ; se non è uguale salto nonAccettato
loop ZA ; fine for
fine: nuovaRiga
lea dx,ok scrive "Password accettata !!!"
mov ah,09h
int 21h

mov ah,4ch
int 21h
end program

1 Risposte

  • Re: Programma asm con errorino :)

    Allora inizio col dirti
    perchè usi direttamente delle locazioni di memoria quando puoi usare delle variabili che hanno il minimo vantaggio di :
    1) rendere la lettura del listato più chiara
    2) compatti il programma
    comunque se non le vuoi usare devi pulire le aree che usi.
    poi le macro non vanno inserite dopo il .code ma prima di esso questo sempre per evitare confusione.
    il programma che tu volevi fare e questo (inpiego meno tempo a riscrivertelo che ha correggerlo!)

    .model small
    .stack
    .data

    inserisci db "Inserisci password: $"
    reInserisci db "Inserisci nuovamente la password: $"
    ok db "Password accettata !!! $"
    nonOk db " Password non accettata $"
    alternativa db "premi invio per terminare spazio per riprovare $"
    passw db 50 dup (?) ; do ampio spazio alla password perchè non so quanti caratteri conterrà
    vpassw db 50 dup (?) ; do le stesse dimensioni della password al fine di poterle trovare uguali
    lp db ? ;lunghezza della password
    lpv db ? ;come sopra
    ;+--------------------------+
    ;¦ sezione delle macro. ¦
    ;+--------------------------+
    nserCar macro ;
    mov dl,"*" ; marco per scrittura "*"
    mov ah,02h ;
    int 21h ;
    endm

    leggiCar macro ;
    mov ah,07h ; macro per lettura carattere
    int 21h ;
    endm

    nuovaRiga macro ;
    mov dl,0ah ;
    mov ah,02h ; macro per nuova riga
    int 21h ;
    mov dl,0dh ;
    int 21h ;
    endm

    vstringa macro testo
    mov dx,offset testo
    mov ah,09h
    int 21h
    endm
    ;+-----------------------+
    ;¦ inizio programma. ¦
    ;+-----------------------+
    .code
    mov ax,@data
    mov ds,ax
    programma: vstringa inserisci
    xor bx,bx
    ciclo_lettura: ; leggo la prima stringa
    leggi car
    mov byte ptr passw[bx],al
    nsercar
    inc bx
    cmp al,13d
    je cambio_riga
    inc byte ptr lp
    jmp ciclo_lettura
    campio_riga: nuovariga
    vstringa reInserisci
    xor bx,bx
    ciclo_lettura2: ;leggo il reinserimento della stringa
    leggi car
    mov byte ptr vpassw[bx],al
    nsercar
    inc bx
    cmp al,13d
    je camma_fa
    inc byte ptr lpv
    jmp ciclo_lettura2
    camma_fa: ; eseguiamo i controlli prima di uscire
    xor bx,bx
    xor dx,dx
    mov bl,lp
    mov dl,lpv ;+--------------------------------------------------------------------------------+
    cmp bl,dl ;¦qui risparmiamo tempo se le 2 stringhe non hanno lo stesso numero ¦
    ;¦ di caratteri sono automaticamente diverse. ¦
    ;+---------------------------------------------------------------------------------+
    jne errore
    ;adesso per confrontare le 2 stringhe esistono varie tecniche quella che fa risparmiare tempo
    ;e utilizzare le istruzioni cmps e repnz ma siccome questo e un esercizio usero la tecnica carattere
    ;per carattere.
    xor cx,cx
    mov cl,lp
    xor si,si
    xor bx,bx
    ciclo_confronto: mov al,byte ptr vpassw[si]
    cmp al,passw[bx]
    jne errore ;non c'è bisogno che termini tutto il ciclo basta trovare il primo carattere diverso!
    inc si
    inc bx
    loop ciclo_confronto ;il confronto tra stringhe sta andando bene
    vstringa ok
    jmp fine:
    errore: vstringa nonok
    nuovaRiga
    vstringa alternativa
    accetta_tasto: ;qui diamo la possibilità di continuare o terminare
    leggi_car
    cmp al,13d
    je fine
    cmp al,32d
    jne accetta_tasto
    nuovaRiga
    jmp programma
    fine:
    mov ax,4c00h
    int 21h
    end program

    un consiglio cerca di scrivere i programmi in maniera più chiara
    non ti ho fatto il confronto minimo sulla dimensione della stringa
    perchè cosi ti do lo scopo per poter modificare il programma.

    se vuoi seguire un corso di assembler vai sul sito http://www.giobe2000.i
    saluti e spero di esserti stato d'aiuto.
    p.s. scusami per eventuali errori di ortografia all'interno dei commenti
    ma conosco meglio l'assembler che l'italiano
Devi accedere o registrarti per scrivere nel forum
1 risposte