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