Passa al contenuto principale
Versione: 2025-26

Sottoprogrammi di utility

Nell'architettura del processore, menzioniamo registri, istruzioni e locazioni di memoria. Quando scriviamo programmi, sfruttiamo però il concetto di terminale, una 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.

Per utilizzare questi sottoprogrammi, utilizziamo la direttiva

.include "./files/utility.s"

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 tastiera, lo mostra anche a schermo. 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 avesse, appunto, ignorato il carattere precedente.

Caratteri speciali​

Avanzamento linea (line feed, LF): carattere \n, codifica 0x0A.

Ritorno carrello (carriage return, CR): 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​

NomeComportamento
incharLegge da tastiera un carattere ASCII e ne scrive la codifica in %al. Non mostra a terminale il carattere letto.
outcharLegge la codifica di un carattere ASCII dal registro %al e lo mostra a terminale.
inbyte / inword / inlongLegge 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 / outlongLegge il contenuto di %al/%ax/%eax e lo mostra a terminale sotto forma di 2/4/8 cifre esadecimali.
indecimal_byte / indecimal_word / indecimal_longLegge dalla tastiera fino a 3/5/10 cifre decimali (0-9), o finché non è inserito un \r, facendone eco e ignorando altri caratteri. Interpreta queste come cifre di un numero naturale, e salva quindi il byte/word/long corrispondente in %al/%ax/%eax.
outdecimal_byte / outdecimal_word / outdecimal_longLegge il contenuto di %al/%ax/%eax, lo interpreta come numero naturale e lo mostra a terminale sotto forma di cifre decimali.
outmessDato l'indirizzo vv in %ebx e il numero nn in %cx, mostra a terminale gli nn caratteri ASCII memorizzati a partire da vv.
outlineDato l'indirizzo vv in %ebx, mostra a terminale i caratteri ASCII memorizzati a partire da vv finché non incontra un \r o raggiunge il massimo di 80 caratteri.
inlineDato l'indirizzo vv in %ebx e il numero nn in %cx, legge da tastiera caratteri ASCII e li scrive a partire da vv finché non è inserito un \r o raggiunge il massimo di n−2n - 2 caratteri. Pone poi in fondo i caratteri \r\n. Supporta l'uso di backspace per correggere l'input.
newlinePorta l'output del terminale a una nuova riga, mostrando i caratteri \r\n.