L'architettura del vecchio IBM PC prevede 1 Mibyte di memoria, in cui alcune fasce hanno degli scopi particolari e non possono essere utilizzate diversamente. Quando si programma a 32 bit, di norma si dispone, in proporzione, di una quantità enorme di memoria, per cui di solito lo spazio inferiore a 1 Mibyte viene semplicemente ignorato e si considera solo lo spazio successivo; ma se la programmazione avviene a 16 bit, si deve operare in quello spazio ristretto.
Buona parte della memoria di un elaboratore conforme all'architettura del IBM PC è impegnata per il codice del BIOS, in cui sono contenute diverse routine attivate da interruzioni, hardware o software. Nella limitazione dell'architettura originale, il sistema offerto di gestione delle interruzioni consentirebbe un utilizzo uniforme dell'hardware.
I microprocessori x86-16 utilizzano una tabella delle interruzioni collocata nella prima parte della memoria, a partire dall'indirizzo 0. La tabella è nota con la sigla IVT, ovvero Interrupt vector table.
Le voci della tabella IVT sono costituite semplicemente da due informazioni: l'indirizzo di segmento e lo scostamento in cui l'interruzione rispettiva viene gestita, attraverso del codice appropriato. Va osservato però che appare prima lo scostamento e poi il segmento.
Supponendo sia n il numero di un'interruzione, si ottiene l'indirizzo della routine di interruzione con un calcolo molto semplice: lo scostamento è disponibile all'indirizzo n×4; il segmento è disponibile all'indirizzo n×4+2.
Solo una porzione delle voci della tabella è utilizzata in modo predefinito, mentre le altre sono disponibili per interruzioni aggiuntive a uso del sistema operativo. In ogni caso, tutta la tabella può essere modificata, in modo da dirigere le interruzioni a codice alternativo.
|
Quando si costruisce una procedura da associare a una voce della tabella delle interruzioni, occorre considerare che prima che la procedura stessa sia raggiunta, il microprocessore inserisce nella pila delle informazioni. Nello specchietto successivo si mettono a confronto le istruzioni relative alle chiamate di interruzioni e di procedure comuni:
|
|
Dopo la tabella IVT, a partire dall'indirizzo 0040016 e fino a 004FF16 incluso, si trova un'area di memoria utilizzata dal BIOS, per annotarvi delle informazioni. Alla fine del capitolo sono riportati i riferimenti alla documentazione che consente di interpretare il contenuto di questa area, ma quello che conta sapere è che non ci si deve scrivere, a meno di impedire alle funzioni del BIOS di operare correttamente.
A partire dall'indirizzo A000016, fino a BFFFF16 incluso, si trova la memoria usata per rappresentare i dati sullo schermo. Successivamente ci sono altre aree di memoria in sola lettura (un'area precedente all'indirizzo F000016 potrebbe essere priva di qualunque cosa) in particolare il blocco da F000016 a FFFFF16 che contiene le procedure del BIOS.
In pratica, a parte la possibilità di scrivere direttamente nella memoria video, per ottenere la rappresentazione del testo sullo schermo, la memoria da A000016 fino alla fine, non può essere utilizzata, ma rimane incerta una porzione di memoria antecedente l'indirizzo A000016 che potrebbe essere utilizzata anch'essa dalle procedure che compongono il BIOS.
Per conoscere l'ammontare di memoria libera si può leggere il valore contenuto all'indirizzo 0041316, nell'ambito della BIOS data area, tenendo conto che si tratta di un numero a 16 bit. Quel valore indica la quantità di memoria utile, espressa in multipli di 1 024 byte, ma occorre considerare che si può utilizzare solo a partire dall'indirizzo 0050016, ovvero dalla fine della BDA. In alternativa, si può chiamare l'interruzione 1216, ottenendo dal registro AX tale valore.
Il BIOS di un elaboratore IBM PC offre una serie di funzionalità, attraverso delle interruzioni, le quali possono essere utilizzate in mancanza di funzioni più sofisticate del sistema operativo. Il testo di riferimento per le interruzioni, del BIOS e dei sistemi operativi che le estendono, è quello di Ralf Brown, annotato alla fine del capitolo. Nelle sezioni successive vengono descritte solo alcune interruzioni offerte esclusivamente da BIOS standard.
Definisce la modalità di funzionamento del video. A seconda della modalità scelta, si possono usare una o più «pagine» distinte.
|
Seleziona la pagina video attiva. La numerazione parte da zero e la quantità di pagine disponibili dipende dalla modalità scelta.
|
Mostra un carattere sullo schermo, alla pagina specificata, facendo avanzare il cursore e facendo scorrere il testo precedente se necessario. In questa modalità di visualizzazione, i caratteri con funzioni speciali vengono interpretati secondo la tradizione, tenendo conto che <CR> riporta il cursore all'inizio della stessa riga e che <LF> fa avanzare alla riga successiva, ma senza riportare il cursore all'inizio.
|
Restituisce la dimensione della memoria utilizzabile, partendo dall'indirizzo 0000016, espressa in multipli di 1 024 byte. La memoria utilizzabile effettivamente inizia solo a partire dall'indirizzo 0050016. Eventualmente lo stesso valore sarebbe accessibile all'indirizzo 0041316, leggendo un numero da 16 bit.
|
Azzera il sistema di gestione dei dischi, per l'unità indicata. L'unità è un numero da zero in su per i dischetti, mentre per i dischi fissi si parte da 8016 in su.
|
|
Legge uno o più settori dal disco alla memoria. Il numero del cilindro in cui si trova il settore iniziale viene indicato utilizzando il registro CH per gli otto bit meno significativi, mentre si aggiungono altri due bit, più significativi, dal registro CL.
L'unità è un numero da zero in su per i dischetti, mentre per i dischi fissi si parte da 8016 in su.
|
|
Scrive uno o più settori dalla memoria nel disco. Il numero del cilindro in cui si trova il settore iniziale viene indicato utilizzando il registro CH per gli otto bit meno significativi, mentre si aggiungono altri due bit, più significativi, dal registro CL.
L'unità è un numero da zero in su per i dischetti, mentre per i dischi fissi si parte da 8016 in su.
|
|
Legge un valore inserito dalla tastiera, eliminandolo dalla memoria tampone associata.
|
|
Legge un valore inserito dalla tastiera, ma senza eliminarlo dalla memoria tampone associata.
|
|
Andrew S. Tanenbaum, Operating Systems: Design and Implementation, prima edizione, 1987, Prentice-Hall, ISBN 0-13-637406-9
Appendice B: introduction to the IBM PC
MAD, Assembly tutorial
Wikipedia, x86 instruction listings
The x86 Interrupt List, aka "Ralf Brown's Interrupt List", "RBIL"
Computer interrupt
http://www.ece.msstate.edu/~reese/EE3724/lectures/interrupt/interrupt.pdf
BiosCentral, BIOS data area
Robert de Bath, Linux 8086 development environment
«a2» 2013.11.11 --- Copyright © Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net