Ciao Pier,
é un po' che non prendo in mano l'8086, non mi é mai piaciuto granché come assemblativo: spero per te ti facciano imparare un po' di 68000, quello si a mio avviso é veramente educativo!
Comunque sia, in allegato sorgente di quello di cui avevi bisogno... non é propriamente il sito adatto ma... vabbè, non ho resistito a buttar giù due righe.
Unica nota: nel tentativo di renderla "riutilizzabile", la routine di mascheramento dell'input non é esattamente delle più ottimizzate ma... fa comunque il suo mestiere.
Scarica emu8086 - ottimo ambiente di lavoro peraltro - e compila in .com con quello.
; Area codice
org 100h
; Procedura principale
; *****************
; Introduzione dati
; *****************
mov AX,DS
mov ES,AX
lea DX,nome
mov AH,9
int 21h
lea SI,mask1
lea BP,salvanome
mov BX,3
mov CX,maxlenght
call input
push DI
lea DX,acapo
mov AH,9
int 21h
lea DX,cognome
mov AH,9
int 21h
lea SI,mask1
lea BP,salvacognome
mov BX,3
mov CX,maxlenght
call input
push DI
lea DX,acapo
mov AH,9
int 21h
lea DX,numero
int 21h
lea SI,mask2
lea BP,password
mov BX,1
mov CX,1
call input
; *****************
; Introduzione dati
; *****************
; lea DI,salvanome
; call strlen
; mov AX,DI
; lea DI,salvacognome
; call strlen
pop BX
pop AX
sub AX,BX
mov BL,[password]
xor BH,BH
sub BX,"0"
lea DI,[password+1]
mov CX,3
imul BX
test DH,80h
js negpwd
pospwd:
lea SI,[salvanome]
jmp printpwd
negpwd:
lea SI,[salvacognome]
printpwd:
rep movsb
mov AH,9
lea DX,acapo
int 21h
lea DX,textpwd
int 21h
lea DX,password
int 21h
ret
; ********
; FUNZIONI
; ********
; Input controllato di una stringa
; Ingresso: BP (Indirizzo di salv. stringa)
; SI (Indirizzo maschera)
; BX (Minimo numero di caratteri)
; CX (Massimo numero di caratteri)
; Non preserva i registri
input:
xor DI,DI
insert:
mov AH,7
int 21h
cmp AL,13
je insert_check
call maskchars
je Insert
cmp AL,8
jne nobackspace
cmp DI,0
je insert
dec DI
mov AH,2
mov DL,8
int 21h
mov DL,32
int 21h
mov DL,8
int 21h
jmp insert
nobackspace:
cmp DI,CX
je insert
mov [BP+DI],AL
mov DL,AL
mov AH,2
int 21h
inc DI
jmp insert
insert_check:
cmp DI,BX
jl insert
mov [BP+DI],0
ret
; Mascheratura di input
; Ingresso: AL (carattere da cercare)
; SI (Indirizzo maschera)
; Uscita: Zero Flag: 0 - Non trovato
; 1 - Trovato
; Preserva i registri
maskchars:
push SI
push AX
mov AH,AL
msk_loop:
lodsb
cmp AL,0
je msk_notfound
cmp AL,AH
jne msk_loop
msk_found:
cmp AL,0
msk_notfound:
pop AX
pop SI
ret
; *********
; Area dati
; *********
maxlenght equ 20
; Stringhe da stampare
nome db "Inserire nome: $"
cognome db "Inserire cognome: $"
numero db "Inserire numero: $"
textpwd db "Password generata: $"
acapo db 10,13,"$",0
; Maschere di input
mask1 db "abcdefghjkilmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",8,0
mask2 db "123456789",8,0
; Stringhe da salvare
salvanome db maxlenght dup (0)
salvacognome db maxlenght dup (0)
password db 0,3 dup (0),"$"