Ciao
Ho provato a creare un piccolo programmino che permette di duplicare un array, il compilatore dice che è tutto ok ma quando eseguo il programma c'è un problema.
Il sorgente:
DATA SEGMENT PUBLIC
INTRO DB "PROGRAMMA CHE DUPLICA IL TUO VETTORE!",10,13,'$'
DOM DB "Digita un numero: ",'$'
ACAPO DB 10,13,'$'
RISPOSTA1 DB "Vettore originale: ",'$'
RISPOSTA2 DB "Vettore duplicato: ",'$'
LUNG EQU 5 ;costante che mi serve per i due vettori, stabilisce la loro grandezza
VETTORE1 DB LUNG DUP(?) ;dichiaro il primo vettore
VETTORE2 DB LUNG DUP(?) ;dichiaro il secondo vettore
DATA ENDS ;fine del segmento dei dati
CODE SEGMENT
ASSUME CS:CODE,DS:DATA ;associa a un registro di segmento un segmento di memoria
INIZIO: ;inizio del programma vero e proprio
;caricamento dei dati
MOV AX,DATA
MOV DS,AX
;DICHIARO UNA MACRO PER ESEGUIRE LA STAMPA DI STRINGHE
STAMPAFRASE MACRO STRINGA
MOV AH,09H ;richiesta per la stampa di una stringa
LEA DX,STRINGA ;carico i dati in DX
INT 21H ;interrupt che permette di stampare la stringa
ENDM ;fine della macro
STAMPAFRASE INTRO ;richiamo la macro per eseguire la stampa della frase di introduzione del programma
STAMPAFRASE ACAPO ;richiamo la macro per eseguire la stringa che mi fa andare a capo
MOV SI,0 ;azzero il registro SI per l'array
MOV CX,LUNG ;metto in CX il valore di lunghezza dell'array
STAMPAFRASE DOM ;richiamo la macro per eseguire la stampa della domanda
MOV AH,01H ;richiesta per l'input di un carattere
CICLOINPUT:
SUB AL,30H ;conversione del carattere digitato
MOV VETTORE1[SI],AL ;sposto nel vettore il valore digitato
INT 21H
INC SI ;incremento il registro puntatore
LOOP CICLOINPUT ;fine del ciclo
MOV CX,SI
MOV SI,0
CICLOCOPIA:
MOV AL,VETTORE1[SI]
MOV VETTORE2[SI],AL
INC SI
LOOP CICLOCOPIA ;fine del ciclo
STAMPAFRASE ACAPO
MOV CX,SI ;metto in CX il numero di elementi contato prima di SI
MOV SI,0 ;azzero il registro SI
STAMPAFRASE RISPOSTA1 ;richiamo la macro per eseguire la stampa di una stringa
MOV AH,02H ;richiesta per la stampa di un carattere
CICLOSTAMPA1:
MOV DL,VETTORE1[SI] ;metto in DL il contenuto della cella dell'array a cui punta il registro SI
ADD DL,30H ;conversione
INT 21H
INC SI
LOOP CICLOSTAMPA1 ;fine del ciclo per la stampa
STAMPAFRASE ACAPO
STAMPAFRASE RISPOSTA2
MOV CX,SI ;metto in CX il numero di elementi contato prima di SI
MOV SI,0 ;azzero il registro SI
MOV AH,02H ;richiesta per la stampa di un carattere
CICLOSTAMPA2:
MOV DL,VETTORE2[SI] ;metto in DL il contenuto della cella dell'array a cui punta il registro SI
ADD DL,30H ;conversione
INT 21H
INC SI
LOOP CICLOSTAMPA2 ;fine dle ciclo per la stampa
;RESTITUISCO IL CONTROLLO AL DOS
MOV AH,4CH
INT 21H
CODE ENDS ;fine del segmento del codice
END INIZIO
L'errore sta nell'output finale ma non riesco a capire il perchè... (si vede nell'immagine allegata)
Allegati: