Architettura IBM PC

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.

Figura u168.1. Mappa generale della memoria.

mappa generale della memoria bassa

IVT: «interrupt vector table»

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.

Figura u168.2. Tabella IVT in memoria.

tabella IVT in memoria

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.

Tabella u168.3. Configurazione iniziale della tabella IVT, secondo l'architettura IBM PC.

Interruzione Descrizione
0016 Eccezione del microprocessore: divide error.
0116 Eccezione del microprocessore: debug.
0216 Eccezione del microprocessore: non maskable interrupt.
0316 Eccezione del microprocessore: breakpoint.
0416 Eccezione del microprocessore: arithmetic overflow.
0516 BIOS: il tasto [Stampa] o [Print_Screen] è stato premuto.
0616 Eccezione del microprocessore: invalid opcode.
0716 Eccezione del microprocessore: no coprocessor.
0816 Interruzione hardware: IRQ 0, temporizzatore.
0916 Interruzione hardware: IRQ 1, tastiera.
0A16 Interruzione hardware: IRQ 2.
0B16 Interruzione hardware: IRQ 3.
0C16 Interruzione hardware: IRQ 4.
0D16 Interruzione hardware: IRQ 5.
0E16 Interruzione hardware: IRQ 6.
0F16 Interruzione hardware: IRQ 7.
1016 BIOS: video.
1116 BIOS: controllo dell'apparecchiatura.
1216 BIOS: memoria disponibile.
1316 BIOS: unità a disco.
1416 BIOS: porte seriali.
1516 BIOS: funzioni varie.
1616 BIOS: tastiera.
1716 BIOS: porte parallele.
1816 BIOS: interprete BASIC in ROM.
1916 BIOS: riavvio.
1A16 BIOS: orologio.
1B16 BIOS: tasto [Interr] o [Break].
1C16 BIOS: temporizzatore.
1D16 BIOS: inizializzazione video.
1E16 BIOS: inizializzazione gestione dischi.
1F16 BIOS: caratteri del video.

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:

int
call far
call
pushf
push cs
push ip
push cs
push ip
push ip
iret
retf
ret
pop ip
pop cs
popf
pop ip
pop cs
pop ip

BIOS data area

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.

Altre aree di memoria

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.

Interruzioni principali

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.

INT 1016/AH=0016 «set video mode»

Definisce la modalità di funzionamento del video. A seconda della modalità scelta, si possono usare una o più «pagine» distinte.

Parametro Descrizione
AH 0016
AL Modalità video:
0016 testo, 40×25 caratteri, 16 colori, 8 pagine;
0316 testo, 80×25 caratteri, 16 colori, 4 pagine.

INT 1016/AH=0516 «select active display page»

Seleziona la pagina video attiva. La numerazione parte da zero e la quantità di pagine disponibili dipende dalla modalità scelta.

Parametro Descrizione
AH 0516
BH Pagina video da selezionare.

INT 1016/AH=0E16 «teletype output»

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.

Parametro Descrizione
AH 0E16
AL Carattere da rappresentare.
BL Numero della pagina video.

INT 1216 «get memory size»

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.

Valore restituito Descrizione
AX Dimensione della memoria disponibile.

INT 1316/AH=0016 «reset disk system»

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.

Parametro Descrizione
AH 0016
DL Numero dell'unità da azzerare.
Valore restituito Descrizione
AH Stato: zero indica un risultato soddisfacente, altrimenti si tratta di un errore.
c (carry) Zero se AH è pari a zero; altrimenti, in presenza di un errore, l'indicatore viene attivato.

INT 1316/AH=0216 «read disk sectors into memory»

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.

Parametro Descrizione
AH 0216
DL Numero dell'unità da cui leggere.
AL Quantità di settori da leggere (deve essere maggiore di zero).
CH, CLbit6, CLbit7 Numero del cilindro del primo settore da leggere, costituito dai bit 7 e 6 del registro DL e dal registro CL (da 0 a 1 023).
CLbit0..CLbit5 Numero del settore, relativo alla traccia, intesa come combinazione di cilindro e testina (da 1 a 63).
DH Numero della testina (da 0 a 63, perché i due bit più significativi potrebbero essere attribuiti ad altre funzioni).
ES:BX (ES*16+BX) Puntatore all'area di memoria che deve ricevere i settori letti.
Valore restituito Descrizione
AH Stato: zero indica un risultato soddisfacente, altrimenti si tratta di un errore.
c (carry) Zero se AH è pari a zero; altrimenti, in presenza di un errore, l'indicatore viene attivato.
AL In presenza di un errore, riporta la quantità di settori letti correttamente.

INT 1316/AH=0316 «write disk sectors»

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.

Parametro Descrizione
AH 0316
DL Numero dell'unità in cui scrivere.
AL Quantità di settori da scrivere (deve essere maggiore di zero).
CH, CLbit6, CLbit7 Numero del cilindro del primo settore da scrivere, costituito dai bit 7 e 6 del registro DL e dal registro CL (da 0 a 1 023).
CLbit0..CLbit5 Numero del settore, relativo alla traccia, intesa come combinazione di cilindro e testina (da 1 a 63).
DH Numero della testina (da 0 a 63, perché i due bit più significativi potrebbero essere attribuiti ad altre funzioni).
ES:BX (ES*16+BX) Puntatore all'area di memoria da cui trarre i dati per la scrittura dei settori.
Valore restituito Descrizione
AH Stato: zero indica un risultato soddisfacente, altrimenti si tratta di un errore.
c (carry) Zero se AH è pari a zero; altrimenti, in presenza di un errore, l'indicatore viene attivato.
AL In presenza di un errore, riporta la quantità di settori scritti correttamente.

INT 1616/AH=0016 «get keystroke from keyboard»

Legge un valore inserito dalla tastiera, eliminandolo dalla memoria tampone associata.

Parametro Descrizione
AH 0016
Valore restituito Descrizione
AH Il valore letto, secondo il codice usato dal BIOS.
AL Il valore letto, tradotto in un carattere ASCII.

INT 1616/AH=0116 «check for keystroke in the keyboard buffer»

Legge un valore inserito dalla tastiera, ma senza eliminarlo dalla memoria tampone associata.

Parametro Descrizione
AH 0116
Valore restituito Descrizione
z (zero) Zero se la lettura è avvenuta con successo; altrimenti, se la memoria tampone è vuota, l'indicatore risulta attivato.
AH Il valore letto, secondo il codice usato dal BIOS.
AL Il valore letto, tradotto in un carattere ASCII.

Riferimenti

«a2» 2013.11.11 --- Copyright © Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net