|
Appunti informatica |
|
Visite: 1166 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:Operatore condizionaleOperatore condizionale L'operatore condizionale, detto talvolta operatore ternario Le variabiliLe variabili E' il momento di ripescare CIAO.C e complicarlo un poco. #include Interazione tra c e assemblerInterazione tra C e Assembler Il C, pur rientrando tra i linguaggi di alto |
Molte applicazioni che richiedono all'utilizzatore l'immissione di dati dalla tastiera necessitano che il buffer della tastiera venga vuotato prima della richiesta di input: si evita in tal modo che tasti battuti, ad esempio, durante durante una fase elaborativa e interpretati al momento sbagliato producano risultati errati o un comportamento imprevedibile del programma. Lo svuotamento del buffer di tastiera può essere effettuato in diversi modi: uno di questi è implementare un ciclo utilizzante il servizio 01h dell'int 16h (vedere pag. e seguenti) per controllare se nel buffer c'è un tasto 'in attesa'; in caso affermativo questo viene rimosso mediante il servizio 00h. L'uscita dal ciclo avviene quando il servizio 01h segnala che il buffer è vuoto.
Un altro metodo consiste nell'utilizzare la funzione 0Ch dell'int 21h, appositamente prevista per pulire il buffer della tastiera e invocare una delle funzioni 01h, 06h, 07h, 08h, 0Ah: se si desidera esclusivamente vuotare il buffer è sufficiente indicare 06h quale valore di AL (funzione) e FFh quale valore di DL (input per la funzione) . Le caratteristiche della funzione 0Ch dell'in 21h sono le seguenti:
Int 21h, serv. 0Ch: Pulisce il buffer di tastiera e invoca un servizio
Input |
AH AL |
0Ch servizio da invocare (può essere 01h, 06h, 07h, 08, 0Ah) Altri registri: valori eventualmente richiesti dalla funzione indicata in AL |
Output |
AL |
il carattere in input (eccetto funzione 0Ah) |
Il terzo metodo utilizza i puntatori alla testa e alla coda del buffer (vedere, anche in questo caso, pag. e seguenti):
BARNINGA_Z! - 1990
CLEARKBD.C - clearkbd()
void cdecl clearkbd(void);
COMPILABILE CON TURBO C++ 1.0
tcc -O -d -c -mx clearkbd.c
dove -mx puo' essere -mt -ms -mc -mm -ml -mh
void cdecl clearkbd(void)
Il meccanismo è banale: il puntatore alla testa e quello alla coda del buffer si trovano agli indirizzi 0:041A e 0:041C, rispettivamente. Tali indirizzi possono pertanto essere considerati i puntatori a detti puntatori: la loro indirezione ne restituisce i valori. La funzione clearkbd(), quindi, non fa altro che rendere uguali il puntatore alla testa e quello alla coda, forzando così la condizione di buffer vuoto.
La funzione di libreria bdos() (vedere pag. ) è quel che ci vuole per applicare il metodo descritto:
.
bdos(0x0C,0xFF,0x06);
.
Per completezza aggiungiamo che il servizio 06h legge un carattere dallo standard input se il registro DL contiene FFh, altrimenti essa scrive sullo standard output il carattere rappresentato dal valore di DL; con la funzione 07h, che attende la pressione di un tasto, è possibile realizzare una rudimentale imitazione di getch() (che, d'altra parte, la utilizza) in grado di pulire il buffer della tastiera:
.
(char)bdos(0x0C,0x00,0x07);
.
La bdos() restituisce se è stato premuto un tasto speciale (tasti funzione, etc.). Per conoscerne il codice è sufficiente invocare una seconda volta la funzione 07h.
.
(char)bdos(0x07,0x00,0x00);
.
Appunti su: |
|