Sottoprogrammi di utility
Nell'architettura del processore, menzioniamo registri, istruzioni e locazioni di memoria. Quando scriviamo programmi, sfruttiamo però il concetto di terminale, un'interfaccia dove l'utente legge caratteri e ne scrive usando la tastiera. Come questo possa avvenire è argomento di altri corsi, dove verranno presentate le interruzioni, il kernel, e in generale cosa fa un sistema operativo.
In questo corso ci limitiamo a sfruttare queste funzionalità tramite del codice ad hoc contenuto in utility.s
.
Queste funzionalità sono fornite come sottoprogrammi, che hanno i loro specifici comportamenti da tenere a mente.
Terminologia
Con leggere caratteri da tastiera si intende che il programma resta in attesa che l'utente prema un tasto sulla tastiera, inviando la codifica di quel tasto al programma.
Con mostrare a terminale si intende che il programma stampa un carattere a video.
Con fare eco di un carattere si intende che il programma, subito dopo aver letto un carattere da tastiere, lo mostra anche a schermo all'utente. Questo è il comportamento interattivo a cui siamo più abituati, ma non è automatico.
Con ignorare caratteri si intende che il programma, dopo aver letto un carattere, controlli che questo sia del tipo atteso: se lo è ne fa eco o comunque risponde in modo interattivo,se non lo è ritorna in lettura di un altro carattere, mostrandosi all'utente come se non avesse, appunto, ignorato il carattere precedente.
Caratteri speciali
Avanzamento linea (line feed, LF): carattere \n
, codifica 0x0A
.
Ritorno carrello (carriage return, RF): carattere \r
, codifica 0x0D
.
Il significato di questi ha a che vedere con le macchine da scrivere, dove avanzare alla riga successiva e riportare il carrello a sinistra erano azioni ben distinte.
Sottoprogrammi
Nome | Comportamento |
---|---|
inchar | Legge da tastiera un carattere ASCII e ne scrive la codifica in %al . Non mostra a terminale il carattere letto. |
outchar | Legge la codifica di un carattere ASCII dal registro %al e lo mostra a terminale. |
inbyte / inword / inlong | Legge dalla tastiera 2/4/8 cifre esadecimali (0-9 e A-F), facendone eco e ignorando altri caratteri. Salva quindi il byte/word/long corrispondente a tali cifre in %al /%ax /%eax . |
outbyte / outword / outlong | Legge il contenuto di %al /%ax /%eax e lo mostra a terminale sottoforma di 2/4/8 cifre esadecimali. |
indecimal_byte / indecimal_word / indecimal_long | Legge dalla tastiera fino a 3/5/10 cifre decimali (0-9), o finché non è inserito un \r , facendone eco e ignorando altri caratteri. Intepreta queste come cifre di un numero naturale, e salva quindi il byte/word/long corrispondente in %al /%ax /%eax . |
outdecimal_byte / outdecimal_word / outdecimal_long | Legge il contenuto di %al /%ax /%eax , lo interpreta come numero naturale e lo mostra a terminale sottoforma di cifre decimali. |
outmess | Dato l'indirizzo in %ebx e il numero in %cx , mostra a terminale gli n caratteri ASCII memorizzati a partire da . |
outline | Dato l'indirizzo in %ebx , mostra a terminale i caratteri ASCII memorizzati a partire da finché non incontra un \r o raggiunge il massimo di 80 caratteri. |
inline | Dato l'indirizzo in %ebx e il numero in %cx , legge da tastiera caratteri ASCII e li scrive a partire da finché non è inserito un \r o raggiunge il massimo di caratteri. Pone poi in fondo i caratteri \r\n . Supporta l'uso di backspace per correggere l'input. |
newline | Porta l'output del terminale ad una nuova riga, mostrando i caratteri \r\n . |