Ciao a tutti!
In questo mio programma (se così si può per ora definire) vorrei prima digitare una parola e inseguito stabilire se ci sono delle ripetizioni di lettere in essa.
Il problema che dopo ripetute correzioni di errori segnalate dal compilatore, il programma si avvia ma non esegue nulla...
Ecco qui il mio codice:
p.s. Assembly 8086
DATA SEGMENT PUBLIC
FRASE DB 9 DUP(?) ;array di 20 caselle di tipo byte
CHAR DB 9 DUP(?) ;array che mi servirà per memorizzare le lettere già presenti nella conta
CONTA DB 0 ;variabile contatore
DOM1 DB "Lunghezza di una parola: ",'$'
DOM2 DB "Digita parola: ",'$'
ACAPO DB "",10,13,'$'
RIS DB "Le ripetizioni presenti nella parola sono: ",'$'
FINEFRASE DB "Fine input della parola!",10,13,'$'
LUNGHEZ DW ? ;lunghezza massima della parola
INDICE1 DW ? ;variabile che contiene l'indice
INDICE2 DW ? ;variabile che contine l'indice
INDICE3 DW ? ;variabile per salvare nell'array la lettera
FLAG DB 0 ;variabile flag che mi serve per tener sottocontrollo alcune situazioni
DATA ENDS ;fine del segmento dei dati
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
INIZIO: ;inizio del programma
STAMPA MACRO stringa
MOV AH,09H
LEA DX,stringa
INT 21H
ENDM ;fine delle procedure
;Caricamento dei dati
MOV AX,DATA
MOV DS,AX
STAMPA DOM1
MOV AH,01H
INT 21H
SUB AL,30H ;conversione del carattere
MOV AH,00H
MOV LUNGHEZ,AX
XOR SI,SI ;azzero il registro SI
STAMPA DOM2 ;richiamo la macro per la stampa della domanda
INPUT: ;inizio del ciclo per l'input di una parola
MOV AH,01H ;richiamo la funzione di input
INT 21H ;interrupt che permette l'input del carattere
SUB AL,30H ;conversione del carattere di input
MOV FRASE[SI],AL ;salvo il carattere nella cella dell'array indicato da SI
INC SI ;incremento l'indice
;stabilisco se continuare il LOOP oppure no
CMP SI,LUNGHEZ
JL INPUT ;fine del ciclo
;Preparo il ciclo per stabilire le lettere che si ripetono
MOV SI,0 ;metto in SI zero per iniziare un nuovo ciclo
MOV INDICE1,0 ;l'indice1 si occupa di puntare alla lettera che viene confrontata
MOV INDICE2,0 ;l'indice2 si occupa di puntare a tutte le altre lettere dell'array
MOV INDICE3,0
CICLO:
MOV SI,INDICE1 ;metto nel registro indice il contenuto di indice1
MOV BL,FRASE[SI] ;metto la lettera contenuta nella cella scelta da SI in BH
MOV INDICE1,SI ;salvo l'indice1
MOV INDICE2,0 ;azzero sempre l'indice2 così da preparare una scansione lineare
MOV SI,0 ;azzero l'indice per sicurezza
XOR AX,AX
MOV AX,INDICE2
MOV SI,AX ;metto l'indice2 in SI
MOV CX,LUNGHEZ ;metto in CX il numero di caratteri della parola
CICLO2:
MOV BH,FRASE[SI] ;salvo in BH il valore da confrontare con la lettera scelta precedentemente
MOV INDICE2,SI
CMP BH,BL ;confronto la lettera scelta ora con quella scelta prima
JE UGUALI ;se le due lettere sono uguali vado a verificare
INC SI ;altrimenti se non sono uguali continuo la scansione incrementando l'indice
JMP CICLO2 ;dopo aver incrementato l'indice riprendo il ciclo2
MOV CX,LUNGHEZ ;metto in CX il numero di caratteri della parola
UGUALI:
MOV AX,INDICE1 ;sposto in AL l'indice1
CMP AX,INDICE2 ;confronto i due indici poichè devono essere diversi
JE CICLO2 ;se i due indici sono uguali non va bene e continuo la scansione lineare
;altrimenti se gli indici sono diversi
MOV SI,0 ;azzero il registro SI in preparazione al ciclo che determina se la lettera è già presente
MOV FLAG,0 ;metto in flag il valore 0 se esso rimane invariato signfica che la lettera che si ripete non è gia stata contata
MOV CX,LUNGHEZ ;metto in CX il numero di giri da fare
LOOPCONF:
MOV AL,CHAR[SI]
CMP BL,AL ;BL è sempre il valore che deve essere confrontato
JE UGUALICONF ;se i due valori sono uguali salto a UGUALICONF
UGUALICONF:
ADD FLAG,1 ;sommo alla variabile FLAG il valore 1
INC SI ;incremento il registro puntatore
LOOP LOOPCONF ;fine del ciclo che serve per confermare la lettera
CMP FLAG,0 ;confronto il contenuto di FLAG con zero
JNZ CONTINUA ;se non sono uguali salto a CONTINUA
;se invece il contenuto di FLAG è zero allora significa che la lettera ancora non è stata salvata
MOV SI,INDICE3 ;metto nel registro puntatore
MOV CHAR[SI],BL ;salvo il contenuto di BL nel registro che conserva gli elementi
ADD INDICE3,1 ;sommo +1 alla variabile indice per una possibile prossima lettera
ADD CONTA,1 ;sommo +1 anche alla variabile conta in quanto conta appunto quante lettere si ripetono nella parola
CONTINUA:
LOOP UGUALI ;fine del "UGUALI"
;CONTROLLO FINALE "CICLO"
MOV SI,INDICE1 ;ripendo l'indice del primo ciclo
INC SI ;incremento l'indice del primo ciclo
CMP SI,LUNGHEZ ;confronto l'indice con la lunghezza della parola
JLE CICLO ;se l'indice è minore o uguale allora ritorna su per un prossimo ciclo
STAMPA RIS ;richiamo la macro per eseguire la stampa
MOV AH,02H
MOV DL,CONTA
ADD CONTA,30H
INT 21H
;Restituisco il controllo al DOS
MOV AH,4CH
INT 21H
CODE ENDS ;fine del segmento del codice
END INIZIO ;fine etichetta che inica l'inizio del programma
Spero che qualcuno mi possa aiutare, grazie!