PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (aprile 2009) SUBTTL** EsA017.ASM - Esercizi PALESTRA ASSEMBLY APPRENDISTI - by ing. G.OBER ;/---------------------------------------------------------------------------\ ;| NOME : EsA017.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : aprile 2009 | ;| DESCRIZIONE : Esercizio nø 0017 | ;| Stampa i 256 numeri esadecimali, in stretta sequenza. | ;| Collaudo della procedura che provvede alla conversione di un| ;| Byte nei 2 caratteri Ascii esadecimali corrispondenti. | ;\---------------------------------------------------------------------------/ ; MACRO UTILIZZATE DAL PROGRAMMA: include c:\arch-lab\bin\GIOBE.MAC ; LIBRERIA UTILIZZATA DAL PROGRAMMA [opzione WinASM altrimenti non necessaria] includelib c:\arch-lab\bin\GIOBE.LIB ;PROCEDURE ESTERNE UTILIZZATE dal PROGRAMMA [NEAR, dalla LIBRERIA ~GIOBE.LIB~] ;----------------------------------------------------------------------------- EXTRN CambiaCol:NEAR EXTRN SET_cur:NEAR EXTRN VIA_cur:NEAR EXTRN RIP_cur:NEAR EXTRN KEYwait:NEAR EXTRN STAsp:NEAR EXTRN Acapo:NEAR EXTRN BIOScls:NEAR EXTRN BIOchr1:NEAR EXTRN BIObeep:NEAR EXTRN BIOSmsg:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC EsA017 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP EsA017 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0FH Testo01 DB " Stai vedendo tutti i valori possibili di un byte ",00H Testo02 DB " Sono 2^8=256, da 00H a FFH; il programma incrementa ",00H Testo03 DB " un registro a 8 bit e ne mostra il contenuto ",00H Testo04 DB " corrente, con l'aiuto della procedura ~Byt2Asc~ ",00H Testo05 DB " Premi un tasto qualunque per tornare al DOS... ",00H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Byt2asc | ;| DESCRIZIONE : Provvede alla conversione dei due nibble di un numero esade-| ;| cimale a 8 bit nei due caratteri ASCII corrispondenti ponen-| ;| doli poi a video nella posizione di stampa corrente, nel co-| ;| lore precedentemente predisposto in CS:[ATTRIB]. | ;| Il codice da convertire Š fornito, in ingresso, in AL ed Š| ;| ancora disponibile in AL in uscita. | ;\---------------------------------------------------------------------------/ Byt2Asc:PUSH AX PUSH AX ;AL=xyH SHR AL,1 SHR AL,1 SHR AL,1 SHR AL,1 ;AL=0xH CMP AL,0AH ;Salta a NUM se AL=0xH < 0AH, cioŠ se il nibble JC NUM ;appena isolato Š un numero (da 0 a 9) ADD AL,07H ;Altrimenti si tratta di una lettera (da A a F) NUM: ADD AL,30H CALL BIOchr1 ;AL= POP AX ;AL=xyH AND AL,0FH ;AL=0yH CMP AL,0AH ;Salta a NUM1 se AL=0yH <0AH, cioŠ se il nibble JC NUM1 ;appena isolato Š un numero (da 0 a 9) ADD AL,07H ;Altrimenti si tratta di una lettera (da A a F) NUM1: ADD AL,30H CALL BIOchr1 ;AL= POP AX RET ;***************************************************************************** ; ---------------------------------------------- EsA017 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- ; Provvede alla cancellazione del video, CALL BIOScls ; posizionando il cursore alla riga0, colonna0, ; in alto a sinistra CALL VIA_cur ; Rende il cursore invisibile M_msgC Testo01,00,10,1FH; M_msgC Testo02,01,10,1FH; Mette a video il titolo M_msgC Testo03,02,10,1FH; M_msgC Testo04,03,10,1FH; M_COLOR 0FH ; Fissa il colore con cui stampare la stringa MOV AL,00H ; Inizializza il registro a 8 bit MOV DH,06 ; Fissa la posizione di stampa iniziale MOV DL,05 ; riga 6, colonna 5 MOV CX,16 ; Contatore delle righe da stampare (sono 16) xxx00: PUSH CX ; Ciclo esterno, per gestire le 16 righe di dati CALL SET_cur ; Fissa dinamicamente la posizione di stampa MOV CX,16 ; Contatore dei bytes per ogni riga (sono 16) xxx01: CALL Byt2Asc ; Ciclo interno, per gestire i 16 bytes per riga PUSH AX ; MOV AL,'H' ; Dopo la stampa dei due caratteri ascii corri- CALL BIOchr1 ; spondenti ai 2 nibble del byte corrente sono MOV AL,' ' ; aggiunti il carattere "H" (per ribadire che si CALL BIOchr1 ; tratta di un valore esadecimale) e uno spazio, POP AX ; per staccare la stampa di un valore da quella INC AL ; del successivo LOOP xxx01 ; INC DH ; Punta la riga successiva e provvede alla sua POP CX ; stampa LOOP xxx00 ; ; ---------------------------------------------- M_msgC Testo05,24,10,1FH; Mette a video la frase di commiato CALL KEYwait ; _OUT: PUSH AX ; Torna al DOS con la memoria liberata e con la CALL RIP_cur ; chiusura di tutti i file; cede il controllo MOV DH,23 ; al processo padre (generalmente COMMAND.COM); MOV DL,0 ; il valore posto eventualmente in AL prima di CALL SET_cur ; uscire pu• essere testato in uscita con la POP AX ; funzione 4DH o mediante la lettura della MOV AH,4CH ; variabile DOS "ERRORLEVEL" INT 21H ; EsA017 ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare