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

Rispondi quotando