PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (aprile 2009) SUBTTL** EsA024.ASM - Esercizi PALESTRA ASSEMBLY APPRENDISTI - by ing. G.OBER ;/---------------------------------------------------------------------------\ ;| NOME : EsA024.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : aprile 2009 | ;| DESCRIZIONE : Esercizio nø 0024 | ;| Conversione da stringa Ascii decimale a numero esadecimale. | ;| Aspetta la digitazione di 2 caratteri Ascii Numerici e li| ;| trasforma nel corripondente numero esadecimale (un byte..). | ;| ****** VERSIONE con procedura assunta direttamente dalla Libreria.| ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: Invio EQU 13 ;Codice Ascii del tasto ; 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 EXTRN Byt2Asc:NEAR EXTRN Dec2Byt:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC EsA024 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP EsA024 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0FH Depo DB "00",00H Testo01 DB " Premi in sequenza SOLO tasti NUMERICI - Invio per terminare",00H Testo02 DB " Digita il NUMERO (massimo 2 cifre, da 0 a 99): ",00H Testo03 DB " Il Numero decimale inserito Š ",00H Testo04 DB ", corrispondente a ",00H Testo05 DB "H esadecimale.",00H Testo06 DB " Premi un tasto qualunque per tornare al DOS... ",00H Testo07 DB "; la conversione non Š stata eseguita...",00H ;***************************************************************************** ; ---------------------------------------------- EsA024 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,00,0FH; Mette a video il titolo, in posizione r00,c00 ; con colore 0FH (bianco brillante su nero) ; ---------------------------------------------- ; PRIMA FASE : Lettura dei Caratteri da Tastiera ; ---------------------------------------------- M_msgC Testo02,02,00,0FH; Messaggio con la richiesta stringa M_CURSOR 02,55 ; Fissa la posizione di stampa per la stringa M_COLOR 0EH ; Fissa il colore con cui stampare la stringa ; Carica in SI l'indirizzo dell'area di memoria LEA SI,DEPO ; in cui salveremo, uno dopo l'altro i caratteri ; che stiamo per leggere dalla tastiera xxx00: CALL KEYwait ; Rimane in attesa della pressione di un tasto ; qualunque (lasciando il suo valore in AL) CMP AL,Invio ; Verifica se il tasto appena premuto Š JE xxx01 ; e in questo caso pone fine all'acquisizione CMP AL,'9' ; Verifica se il carattere letto dal deposito Š JA xxx00 ; un NUMERO; se Š pi— grande di "9" (JA) o pi— CMP AL,'0' ; piccolo di "0" (JB) non ci interessa e si JB xxx00 ; ritorna in attesa di tasti numerici ; Se invece si tratta di un NUMERO salva il co- MOV CS:[SI],AL ; dice appena assunto da tastiera nel deposito INC SI ; ("Depo", puntato da SI) e poi incrementa il ; puntatore per puntare la locazione successiva CALL BIOchr1 ; Pone a video il carattere appena assunto da JMP SHORT xxx00 ; tastiera e torna in attesa di pressione tasti ; xxx01: MOV AL,00H ; Comunque sostituisce il carattere Ascii MOV CS:[SI],AL ; con 00H, con cui termina la stringa acquisita ; ---------------------------------------------- ; SECONDA FASE : Conversione della stringa ; ---------------------------------------------- ; Ricarica il puntatore all'area di memoria in LEA SI,Depo ; cui sono stati salvati, uno dopo l'altro, i ; caratteri appena acquisiti dalla tastiera ; Analizza la stringa puntata da CS:SI, costi- ; tuita rigorosamente da SOLO caretteri Ascii CALL Dec2Byt ; numerici e terminata con il terminatore 00H, ; lasciando in AL il numero a 8 bit corrispon- ; dente al valore numerico decimale della ; stringa stessa (AL=FFH in caso d'errore) ; ---------------------------------------------- ; TERZA FASE : Stampa dei risultati PUSH AX ; ---------------------------------------------- M_msgC Testo03,05,00,0FH; " Il Numero decimale inserito Š " M_COLOR 0EH ; M_msgN Depo ; <<< stringa acquisita >>>> ; ---------------------------------------------- CMP AL,0FFH ; JNE xxx02 ; M_COLOR 0FH ; M_msgN Testo07 ; "; la conversione non Š stata eseguita..." JMP SHORT xxx03 ; ; ---------------------------------------------- xxx02: M_COLOR 0FH ; M_msgN Testo04 ; ", corrispondente a " M_COLOR 0EH ; POP AX ; CALL Byt2aSC ; M_COLOR 0FH ; M_msgN Testo05 ; "H esadecimale." ; ---------------------------------------------- xxx03:M_msgC Testo06,24,01,0FH; 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 ; EsA024 ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare