31.05.2013 Views

Tricky C - Si® @lbert Site

Tricky C - Si® @lbert Site

Tricky C - Si® @lbert Site

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

16 - <strong>Tricky</strong> C<br />

I P U N T A T O R I<br />

Una variabile è un'area di memoria alla quale è associato un nome simbolico, scelto dal<br />

programmatore (vedere pag. 13). Detta area di memoria è grande quanto basta per contenere il tipo di<br />

dato indicato nella dichiarazione della variabile stessa, ed è collocata dal compilatore, automaticamente,<br />

in una parte di RAM non ancora occupata da altri dati. La posizione di una variabile in RAM è detta<br />

indirizzo, o address. Possiamo allora dire che, in pratica, ad ogni variabile il compilatore associa sempre<br />

due valori: il dato in essa contenuto e il suo indirizzo, cioè la sua posizione in memoria.<br />

G l i i n d i r i z z i d i m e m o r i a<br />

Proviamo ad immaginare la memoria come una sequenza di piccoli contenitori, ciascuno dei<br />

quali rappresenta un byte: ad ogni "contenitore", talvolta detto "locazione", potremo attribuire un numero<br />

d'ordine, che lo identifica univocamente. Se il primo byte ha numero d'ordine 0, allora il numero<br />

assegnato ad un generico byte ne individua la posizione in termini di spostamento (offset) rispetto al<br />

primo byte, cioè rispetto all'inizio della memoria. Così, il byte numero 12445 dista proprio 12445 byte dal<br />

primo, il quale, potremmo dire, dista 0 byte da se stesso. L'indirizzamento (cioè l'accesso alla memoria<br />

mediante indirizzi) avviene proprio come appena descritto: ogni byte è accessibile attraverso il suo offset<br />

rispetto ad un certo punto di partenza, il quale, però, non necessariamente è costituito dal primo byte di<br />

memoria in assoluto. Vediamo perché.<br />

Nella CPU del PC sono disponibili alcuni byte, organizzati come vere e proprie variabili, dette<br />

registri ( register). La CPU è in grado di effettuare elaborazioni unicamente sui valori contenuti nei propri<br />

registri (che si trovano fisicamente al suo interno e non nella RAM); pertanto qualunque valore oggetto di<br />

elaborazione deve essere "caricato", cioè scritto, negli opportuni registri. Il risultato delle operazioni<br />

compiute dalla CPU deve essere conservato, se necessario, altrove (tipicamente nella RAM), al fine di<br />

lasciare i registri disponibili per altre elaborazioni.<br />

Anche gli indirizzi di memoria sono soggetti a questa regola.<br />

I registri del processore Intel 8086 si compongono di 16 bit ciascuno, pertanto il valore massimo<br />

che essi possono esprimere è quello dell'integer, cioè 65535 (esadecimale FFFF): il massimo offset<br />

gestibile dalla CPU permette dunque di indirizzare una sequenza di 65536 byte (compreso il primo, che<br />

ha offset pari a 0), corrispondenti a 64Kb.<br />

Configurazioni di RAM superiori (praticamente tutte) devono perciò essere indirizzate con uno<br />

stratagemma: in pratica si utilizzano due registri, rispettivamente detti registro di segmento (segment<br />

register) e registro di offset (offset register). Segmento e offset vengono solitamente indicati in notazione<br />

esadecimale, utilizzando i due punti (":") come separatore, ad esempio 045A:10BF. Ma non è tutto.<br />

Se segmento e offset venissero semplicemente affiancati, si potrebbero indirizzare al<br />

massimo 128Kb di RAM: infatti si potrebbe avere un offset massimo di 65535 byte a partire dal byte<br />

numero 65535. Quello che occorre è invece un valore in grado di numerare, o meglio di indirizzare,<br />

almeno 1Mb: i fatidici 640Kb, ormai presenti su tutte le macchine in circolazione, più gli indirizzi<br />

riservati al BIOS e alle schede adattatrici 18 . Occorre, in altre parole, un indirizzamento a 20 bit 19 .<br />

Questo si ottiene sommando al segmento i 12 bit più significativi dell'offset, ed accodando i 4<br />

bit rimanenti dell'offset stesso: tale tecnica consente di trasformare un indirizzo segmento:offset in un<br />

18 Ma perché proprio tale suddivisione? Perché gli indirizzi superiori al limite dei 640Kb sono stati riservati,<br />

proprio in sede di progettazione del PC, al firmware BIOS e al BIOS delle schede adattatrici (video, rete, etc.), sino<br />

al limite di 1 Mb.<br />

19 In effetti, 2 20 = 1.048.576: provare per credere. Già che ci siamo, vale la pena di dire che le macchine basate<br />

su chip 80286 o superiore possono effettuare indirizzamenti a 21 bit: i curiosi possono leggere i particolari a<br />

pagina 226.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!