PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (aprile 2009) SUBTTL** EsA016.ASM - Esercizi PALESTRA ASSEMBLY APPRENDISTI - by ing. G.OBER ;/---------------------------------------------------------------------------\ ;| NOME : EsA016.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : aprile 2009 | ;| DESCRIZIONE : Esercizio nø 0016 | ;| Aspetta la digitazione di una stringa composta da caratteri| ;| qualsiasi; poi rende maiscole le lettere minuscole presenti.| ;| NB: Š ammessa una stringa al massimo con 80 caratteri. | ;\---------------------------------------------------------------------------/ ; 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 ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC EsA016 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP EsA016 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0FH Depo DB 80 DUP (' ') ;riserva 80 caratteri "vuoti" per la stringa in ;acquisizione... Testo01 DB " Premi in sequenza i tasti desiderati - Invio per terminare",00H Testo02 DB " Digita la stringa che vuoi convertire in Maiuscolo: ",00H Testo03 DB " La stringa convertita in Maiuscolo Š: ",00H Testo04 DB " Premi un tasto qualunque per tornare al DOS... ",00H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;---------------------------------------------------------------------------- ;Per ora nessuna ;***************************************************************************** ; ---------------------------------------------- EsA016 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 03,01 ; 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) ; Salva il codice appena assunto da tastiera nel MOV CS:[SI],AL ; deposito ("Depo", puntato da SI) e poi prepara INC SI ; il puntatore (incrementa SI) per puntare ; la locazione successiva CMP AL,Invio ; Verifica se il tasto appena premuto Š JE xxx01 ; e in questo caso pone fine all'acquisizione CALL BIOchr1 ; Altrimenti pone a video il carattere appena JMP SHORT xxx00 ; assunto da tastiera e torna in attesa della ; pressione di altri tasti ; ---------------------------------------------- ; SECONDA FASE : Trasformazione in Maiuscolo ; ---------------------------------------------- ; Ricarica il puntatore all'area di memoria in xxx01: LEA SI,DEPO ; cui sono stati salvati, uno dopo l'altro, i ; caratteri appena acquisiti dalla tastiera xxx02: MOV AL,CS:[SI] ; Assume dal Deposito il carattere corrente CMP AL,Invio ; Verifica se il codice appena assunto Š JE xxx04 ; e in questo caso pone fine alla conversione CMP AL,'z' ; Verifica se il carattere letto dal deposito Š JA xxx03 ; una lettera minuscola; se Š pi— grande di "z" CMP AL,'a' ; (JA) o pi— piccolo di "a"(JB) non ci interessa JB xxx03 ; e si rientra nel loop per cercare i caratteri ; effettivamente minuscoli ; Se invece si tratta di una lettera minuscola ; con questa istruzione la si trasforma in ; maiuscola ; in fatti la AND forza il bit 5 ; comunque a 0 per cui, per esempio: AND AL,11011111B ; >>> "A"=41H=01000001B diventa 01000000=41H="A" ; cioŠ non cambia, essendo gi… MAIUSCOLA ; >>> "a"=61H=01100001B diventa 01000000=41H="A" ; cioŠ cambia da minuscola a MAIUSCOLA MOV CS:[SI],AL ; Salva nel deposito, al posto del precedente il ; codice appena reso maiuscolo xxx03: INC SI ; Prepara SI per puntare la locazione successiva JMP SHORT xxx02 ; e continua il processo di ricerca e conversio- ; ne di altre eventuali lettere minuscole ; ---------------------------------------------- ; TERZA FASE : Stampa della nuova stringa ; ---------------------------------------------- ; La stringa Š stata convertita completamente... ; Queste istruzioni servono per sostituire il xxx04: MOV AL,00H ; caratterea Ascii di con quello del MOV CS:[SI],AL ; carattere terminatore 00H, necessario per ; trasformare i caratteri del deposito DEPO in ; un messaggio gestibile dalla procedura BIOSmsg M_msgC Testo03,05,00,0FH; Messaggio con la presentazione del risultato M_msgC Depo,06,01,0EH ; Stampa la stringa, ora adattata a Messaggio ; ---------------------------------------------- M_msgC Testo04,24,04,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 ; EsA016 ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare