codice:
TITLE - Esercitazione di Calcolatori Elettronici
;Definizione costanti
PAGINA EQU 00h
HT EQU 09h
LF EQU 0Ah
CR EQU 0Dh
;
BIOS_VIDEO EQU 10H
SET_VIDEO_MODE EQU 00h ;in AH
MODO_TESTO EQU 03H ;in AL
;
SET_CURSOR EQU 02h ;in AH
W_CHR_TTY EQU 0Eh ;in AH
;
DOS EQU 21H
R_KEY_CHR EQU 01H
PRINT_STRING EQU 09H
R_KEY_CHR_NE EQU 07h
DSEG SEGMENT PARA PUBLIC 'DATA'
TITOLO DB 'CORSO di CALCOLATORI ELETTRONICI$'
ISTRUZIONE_1 DB CR,LF,LF,HT,'Digita il primo numero (max 5 cifre): $'
ISTRUZIONE_2 DB CR,LF,LF,HT,'Digita il SECONDO numero (max 5 cifre): $'
BIN_MESS DB CR,LF,HT,HT,'Rappresentazione Binaria: $'
TERMINE DB CR,LF,LF,HT,'Un''altra iterazione? [S/N]$'
MSG_ERRORE DB CR,LF,LF,HT,'Sono permessi solo caratteri numerici! Pertanto...$'
MSG_EMPTY DB CR,LF,LF,HT,'Non hai scritto nessun numero$'
MSG_MAX DB CR,LF,LF,HT,'IL NUMERO INSERITO E SUPERIORE 64000...$'
MSG_UGUALE DB CR,LF,LF,HT,'HAI IMMESSO DUE NUMERI UGULAI..DA CAPO$'
RIS DB CR,LF,LF,HT,'IL RISULTATO E $'
NUM_1 DB 5 DUP(0)
NUM_2 DB 5 DUP(0)
NUM_1B DB 16 DUP(0)
DSEG ENDS
STACKM SEGMENT PARA STACK 'STACK' ;Viene allocata una zona di
DB 64 DUP('12345678') ; memoria per lo Stack: in
STACKM ENDS ; tutto 64*8 bytes.
ASSUME CS:CSEG,DS:DSEG,SS:STACKM
CSEG SEGMENT PARA PUBLIC 'CODE'
;---------------------------------------------------------------------;
; Corpo principale del programma ;
;---------------------------------------------------------------------;
MAIN PROC FAR
PUSH DS ;Istruzioni da lasciare SEMPRE
MOV AX,00h ; al principio dei programmi!
PUSH AX ;
CALL INIZIALIZZAZIONE
CICLO_PRINCIPALE: MOV DX,OFFSET ISTRUZIONE_1
CALL STAMPA_STRINGA
LEA SI,NUM_1
CALL ACQUISIZIONE
LEA SI,NUM_1
CALL CONVERSIONE
JNC CICLO_PRINCIPALE
ACQ_2: MOV DX,OFFSET ISTRUZIONE_2
CALL STAMPA_STRINGA
LEA SI,NUM_2
CALL ACQUISIZIONE
LEA SI,NUM_2
CALL CONVERSIONE
JNC ACQ_2
CALL CONFRONTO
JZ CICLO_PRICIPALE
CALL STAMPA_BIN
CALL STAMPA_RIS
CALL TEST_FINALE
JNZ CICLO_PRINCIPALE
RET ;Ritorno al Sistema Operativo
MAIN ENDP
;---------------------------------------------------------------------;
; Procedura di inizializzazione ;
; ;
; REGISTRI UTILIZZATI: AX, DX, DS ;
;---------------------------------------------------------------------;
INIZIALIZZAZIONE PROC NEAR
MOV AX,DSEG ;Inizializzazione segmento dati
MOV DS,AX ; tramite il registro AX.
MOV AH,SET_VIDEO_MODE ;Servizio BIOS 'Set Video Mode':
MOV AL,MODO_TESTO ; modo testo 80 x 25, colori
INT BIOS_VIDEO ;
MOV DX,0315h ;Imposta riga (DH) e colonna (DL)
CALL SPOSTA_CURSORE ;Muove il cursore nella pos scelta
MOV DX,OFFSET TITOLO ;Sceglie la stringa (DS:DX)
CALL STAMPA_STRINGA ; e la stampa.
MOV DX,0606h ;Imposta riga (DH) e colonna (DL)
CALL SPOSTA_CURSORE ;Muove il cursore nella pos scelta
RET ;Ritorno alla procedura chiamante
INIZIALIZZAZIONE ENDP
ACQUISIZIONE PROC NEAR
INIZIO_1: MOV CL,05d
MOV CH,0
CICLO_1: MOV AH,R_KEY_CHR
INT DOS
CMP AL,CR
JE FINE_1
CMP AL,'9'
JA ERRORE_1
CMP AL,'0'
JB ERRORE_1
MOV DS:[SI],AL
INC SI
LOOP CICLO_1
JMP FINE_1
ERRORE_1: LEA DX,MSG_ERRORE
CALL STAMPA_STRINGA
LEA DX,ISTRUZIONE_1
CALL STAMPA_STRINGA
JMP INIZIO_1
FINE_1: MOV AL,00H
MOV DS:[SI],AL
RET
ACQUISIZIONE ENDP
;----------------------CONVERSIONE-------------------------------------------;
CONVERSIONE PROC NEAR
; LEA SI,NUM_1
PUSH BX
;PUSH CX
PUSH BP
PUSH SI
MOV CX,0000H
START: MOV AL,DS:[SI]
CMP AL,00H
JE EMPTY
INC CX
INC SI
JMP START
EMPTY: POP SI
MOV AX,0000H
CMP CX,0000H
JE W1
MOV AX,5
SUB AX,CX
MOV CX,AX
CMP CX,0000H
JE W5
W2: PUSH CX
MOV BX,5
MOV CX,5
W3: MOV AL,DS:[SI+BX-1]
MOV DS:[SI+BX],AL
DEC BX
LOOP W3
MOV AL,'0'
MOV DS:[SI+BX],AL
POP CX
LOOP W2
W5: MOV BP,0000H
MOV CX,5
MOV BX,10000
W4: MOV AL,DS:[SI]
SUB AL,'0'
MOV AH,00H
MUL BX
INC SI
ADD BP,AX
MOV AX,BX
MOV BX,10
DIV BX
MOV BX,AX
LOOP W4
MOV AX,BP
CMP AX,64000
JB FINE_CONV ;se e minore salta
MOV DX,OFFSET MSG_MAX ;numero maggiore
CALL STAMPA_STRINGA
JMP FINE_C
W1: LEA DX,MSG_EMPTY ;nessun numero
CALL STAMPA_STRINGA
JMP FINE_C
FINE_CONV: POP BP
POP BX
PUSH AX
JMP FINE_C
POP BP
POP BX
FINE_C: RET
CONVERSIONE ENDP
;--------------CONFRONTO--------------------------------;
CONFRONTO PROC NEAR
POP AX
MOV BX,AX
POP AX
CMP AX,BX
JE UGUALE
CMP AX,BX
JG SALTO_1
JMP SALTO_2
SALTO_1:PUSH BX
PUSH AX
JMP FINE
SALTO_2:PUSH AX
PUSH BX
JMP FINE
UGUALE: MOV DX,OFFSET MSG_UGUALE
CALL STAMPA_STRINGA
FINE: RET
CONFRONTO ENDP
;--------------------STAMPA_BIN------------------------;
STAMPA_BIN PROC NEAR
MOV BX,0000H
INIT: LEA SI,NUM_1B
POP DX
PUSH DX
;MOV DX,AX
MOV CL,10H
MOV CH,00H
CICLO_BINARIO: XOR AL,AL ;Azzera il registro AL
SHL DX,01h ;Shift Logico a Sinistra
ADC AL,AL ;In AL si pone il CARRY
MOV DS:[SI],AL
INC SI
DEC CL ;Decrementa il contatore del ciclo
JNZ CICLO_BINARIO ;Se non e' 0 itera un'altra volta
POP CX
INC CX
PUSH CX
LEA SI,NUM_1B
MOV CL,00H
MOV CH,00H
BO_0: MOV AL,DS:[SI]
BO_X: CMP CL,16
JE FINE_CO
BO_Z: CMP AL,0
JE BO_1
INC SI
INC CL
JMP BO_0
BO_1: INC SI
INC CL
CMP CL,16
JE FINE_CO
MOV AL,DS:[SI]
CMP AL,1
JE BO_2
JMP BO_0
BO_2: INC SI
INC CL
CMP CL,16
JE FINE_CO
MOV AL,DS:[SI]
CMP AL,1
JE BO_3
JMP BO_0
BO_3: INC SI
INC CL
MOV AL,DS:[SI]
CMP AL,0
JE CO5
JMP BO_X
CO5: INC BX
CMP CL,16
JE FINE_CO
JMP BO_Z
FINE_CO: POP CX
POP AX
CMP CX,AX
JE ENDI
PUSH AX
PUSH CX
JMP INIT
ENDI: RET
STAMPA_BIN ENDP
;-------------------STAMPA_RIS----------------------;
STAMPA_RIS PROC NEAR
MOV DX,OFFSET RIS
CALL STAMPA_STRINGA
MOV AX,BX
CMP AX,10000
JC SRW_0
MOV DX,0000H
MOV BX,10000
DIV BX
CALL STAMPA_NUMERO
MOV AX,DX
JMP SRW_1
SRW_0: CMP AX,1000
JC SRB_0
SRW_1: MOV DX,0000H
MOV BX,1000
DIV BX
CALL STAMPA_NUMERO
MOV AX,DX
JMP SRB_1
SRB_0: CMP AX,100
JC SRB_2
SRB_1: MOV BL,100
DIV BL
CALL STAMPA_NUMERO
MOV AL,AH
MOV AH,00H
JMP SRB_3
SRB_2: CMP AX,10
JC SRB_4
SRB_3: MOV BL,10
DIV BL
CALL STAMPA_NUMERO
MOV AL,AH
SRB_4: CALL STAMPA_NUMERO
RET
STAMPA_RIS ENDP
;-------PROCEDURE D BASSO LIVELLO-----------------;
TEST_FINALE PROC NEAR
MOV DX,OFFSET TERMINE
CALL STAMPA_STRINGA ; e la stampa.
CALL LETTURA_SN ;Legge da tastiera senza echo.
CMP AL,'n' ;Modifica il FLAG 'Z'
RET
TEST_FINALE ENDP
STAMPA_NUMERO PROC NEAR
ADD AL,'0'
MOV AH,W_CHR_TTY
INT BIOS_VIDEO
RET
STAMPA_NUMERO ENDP
LETTURA_SN PROC NEAR
NUOVA_LETTURA: MOV AH,R_KEY_CHR_NE
INT DOS
OR AL,00100000b
CMP AL,'n'
JZ FINE_LETTURA
CMP AL,'s'
JNZ NUOVA_LETTURA
FINE_LETTURA: RET
LETTURA_SN ENDP
SPOSTA_CURSORE PROC NEAR
MOV BH,PAGINA
MOV AH,SET_CURSOR
INT BIOS_VIDEO
RET
SPOSTA_CURSORE ENDP
STAMPA_STRINGA PROC NEAR
MOV AH,PRINT_STRING
INT DOS
RET
STAMPA_STRINGA ENDP
CSEG ENDS
END MAIN