ma non č completo....mi sono fermato perchč se il giorno introdotto dall'utente č di due cifre negli elementi dell' array GIORNO non me riesce a mettermele in quanto sono elementi DB...se li cambio in DW non mi copia da AL a giorno in quanto AL č DB...se uso AX al posto di AL,non mi vā in quanto sorgente č di DB...se continuo e cambio in DB anche sorgente non mi vā in quanto i caratteri introdotti dall'utente vanno memorizzati solo in AL (usando l'istruzione 01h con int 21h)...č una catena insomma,non riesco a copiare il giorno in una memoria...lo stesso dicasi per mese e anno
;************************************************* *******************************************
pila SEGMENT STACK ;viene allocata una zona di
DB 400H DUP(?) ;memoria di 1024 bytes per
pila ENDS ;lo stack
;************************************************* *******************************************
;************************************************* *******************************************
DSEG SEGMENT ;Definizione delle costanti
;e delle variabili
LF EQU 0AH
CR EQU 0DH
TAB EQU 09H
DOS EQU 21H
BIOS_VIDEO EQU 10H
RTN_DOS EQU 4CH
PRINT_STRING EQU 09H
READ_CHAR EQU 01H
SET_MODE EQu 00H
max_len EQU 10D
ANNO DW ''
MESE DB ''
MES30 DB 4,6,9,11
TITOLO DB CR,LF,CR,LF,TAB,TAB,TAB,'-CORSO DI CALCOLATORI ELETTRONICI-$'
TITOLO1 DB CR,LF,TAB,TAB,'Compito n. 45 - diff tra due date - versione A$'
TITOLO2 DB CR,LF,TAB,TAB,TAB,'Autore: Serracca Enrico, mat. 164708 $'
TITOLO6 DB CR,LF,CR,LF,'Inserire la prima data nel formato(giorno/mese/anno): $'
TITOLO7 DB CR,LF,CR,LF,'Messaggio cifrato: $'
TITOLO8 DB CR,LF,CR,LF,'Giorno corretto $'
TITOLO9 DB CR,LF,CR,LF,'Data errata $'
TITOLOE DB CR,LF,'Riavviare il programma? (S/N): $'
SPAZI DB CR,LF,CR,LF,'$'
GIORNO DB max_len DUP(?)
sorgente DB max_len DUP(?)
destinazione DB max_len+1 DUP(?)
DSEG ENDS
;************************************************* ********************************************
ASSUME CS:SEG CSEG, DS:SEG DSEG, SS:SEG pila
CSEG SEGMENT 'CODE'
;-------------------------------------------------------------------------------------------;
; Corpo principale del programma ;
;-------------------------------------------------------------------------------------------;
main:
PUSH DS ; Istruzioni da lasciare SEMPRE
MOV AX,00H ; al principio dei programmi
CALL INIZIALIZZAZIONE
CALL CONTROLLO
EXIT:
MOV DX, OFFSET TITOLOE ; chiedo all'utente se vuole riavviare il programma
CALL STAMPA_STRINGA
MOV AH, READ_cHAR
INT DOS
CMP AL, 'S'
JE main
CMP AL, 's'
JE main
MOV AH, RTN_DOS ; Ritorno al Sistema Operativo
INT DOS
;------------------------------------------------------------------------------------------;
; Procedura di inizializzazione ;
; ;
; REGISTRI UTILIZZATI: AH, AL, DX, DS ;
;------------------------------------------------------------------------------------------;
INIZIALIZZAZIONE PROC NEAR
MOV AH, SET_MODE ;pulisce lo schermo e
MOV AL, 03H ;cambia modo video tipo 80x25 16+8 colori
INT BIOS_VIDEO
MOV DX, OFFSET TITOLO
CALL STAMPA_STRINGA
MOV DX, OFFSET TITOLO1
CALL STAMPA_STRINGA
MOV DX, OFFSET TITOLO2
CALL STAMPA_STRINGA
RET
INIZIALIZZAZIONE ENDP
;-----------------------------------------------------------------------------------------;
; Procedura di controllo formato ;
; ;
; REGISTRI UTILIZZATI: AX, CX, DX, SI, DI ;
;-----------------------------------------------------------------------------------------;
CONTROLLO PROC NEAR
MOV DX, OFFSET TITOLO6
CALL STAMPA_STRINGA
MOV SI, 0
prossimo_car:
CMP SI, max_len
JG intermediate
MOV AH, READ_CHAR ;leggo un carattere dalla tastiera
INT DOS
CMP AL, CR ;č = a return ?
JE fine_lettura ;se si smetto di leggere
MOV sorgente[SI], AL;sposto il carattere in sorgente
INC SI ;incremento si
JMP prossimo_car ;leggo il prossimo car
fine_lettura:
MOV sorgente[SI], '$'
MOV DX, OFFSET SPAZI
CALL STAMPA_STRINGA
MOV DX, OFFSET sorgente
CALL STAMPA_STRINGA
MOV DX, OFFSET SPAZI
CALL STAMPA_STRINGA
MOV CX, SI ;sposto in CX la lunghezza del messaggio sorgente
controllo_giorni:
MOV SI,0
MOV DI,0
MOV BH,sorgente[SI]
MOV AL,sorgente[SI+1]
CMP BH,'3'
JG intermediate
CMP BH,'0'
JL intermediate
CMP AL,'9'
JG intermediate
CMP AL,'0'
JL intermediate
CMP BH,'0'
JE giorno0
CMP BH,'1'
JE giorno1
CMP BH,'2'
JE giorno2
CMP BH,'3'
JE giorno3
intermediate:
jmp errore
giorno0:
CMP AL,'0'
JE intermediate
MOV AL,GIORNO[0]
JMP controllo_Barra
giorno1:
ADD AL, 10
MOV AL,GIORNO[0]
JMP controllo_Barra
giorno2:
ADD AL,20
MOV AL,GIORNO[0]
JMP controllo_Barra
giorno3: CMP AL,'1'
JG intermediate
ADD AL,30
MOV AL,GIORNO[0]
JMP controllo_Barra
controllo_Barra:
MOV AH,sorgente[SI+2]
MOV BH,sorgente[SI+5]
CMP AH,'/'
JNE intermediate
CMP BH,'/'
JNE intermediate
JMP controllo_mese
controllo_mese:
MOV AH,sorgente[SI+3]
MOV BH,sorgente[SI+4]
CMP AH,'1'
JG intermediate
CMP AH,'0'
JL errore
CMP BH,'9'
JG errore
CMP BH,'0'
JL errore
CMP AH,'0'
JE mese0
CMP AH,'1'
JE mese1
mese0:
CMP BH,'0'
JE errore
MOV MESE,BH
RET
mese1:
CMP BH,'2'
JG errore
ADD BH,10
MOV MESE,BH
RET
errore: MOV DX, OFFSET TITOLO9
CALL STAMPA_STRINGA
MOV DX, OFFSET SPAZI
CALL STAMPA_STRINGA
RET
CONTROLLO ENDP
;-----------------------------------------------------------------------------------------;
; Procedura per stampare una stringa ;
; ;
;PARAMETRI: l'indirizzo della stringa e' memorizzato in DSX ;
;REGISTRI UTILIZZATI: AX, DX, DS ;
;-----------------------------------------------------------------------------------------;
STAMPA_STRINGA PROC NEAR
MOV AX,SEG DSEG ;Inizializzazione segmento dati
MOV DS,AX ;tramite il registro AX.
MOV AH,PRINT_STRING ;Servizio DOS 'Print String'; la
INT DOS ;stringa e' puntata da DSX.
RET ;Ritorno alla procedura chiamante
STAMPA_STRINGA ENDP
CSEG ENDS
;************************************************* ******************************************
END main
;************************************************* ******************************************