Barninga Z
a- a+

I puntatori: gli indirizzi di memoria

PUNTATORI 

Gli indirizzi di memoria 

Proviamo ad immaginare la memoria come una sequenza dipiccoli contenitori, ciascuno dei quali rappresenta un byte:ad ogni "contenitore" , talvolta detto"locazione" , potremo attribuire un numerod'ordine, che lo identifica univocamente. Se il primobyte ha numero d'ordine 0, allora il numero assegnato adun generico byte ne individua la posizione in termini dispostamento (offset) rispetto al primo byte,cioè rispetto all'inizio della memoria.Così, il byte numero 12445 dista proprio 12445 bytedal primo, il quale, potremmo dire, dista 0 byte da sestesso. L'indirizzamento (cioè l'accesso allamemoria mediante indirizzi) avviene proprio come appenadescritto: ogni byte è accessibile attraverso il suooffset rispetto ad un certo punto di partenza, il quale,però, non necessariamente è costituito dalprimo byte di memoria in assoluto. Vediamoperché. 

Nella CPU del PC sono disponibili alcuni byte, organizzaticome vere e proprie variabili, dette registri(register). La CPU è in grado di effettuareelaborazioni unicamente sui valori contenuti nei propriregistri (che si trovano fisicamente al suo interno e nonnella RAM); pertanto qualunque valore oggetto di elaborazionedeve essere "caricato" , cioè scritto, negliopportuni registri. Il risultato delle operazioni compiutedalla CPU deve essere conservato, se necessario, altrove(tipicamente nella RAM), al fine di lasciare i registridisponibili per altre elaborazioni. 

Anche gli indirizzi di memoria sono soggetti a questaregola. 

I registri del processore Intel 8086 si compongono di 16 bitciascuno, pertanto il valore massimo che essi possonoesprimere è quello dell'integer, cioè65535 (esadecimale FFFF): il massimo offsetgestibile dalla CPU permette dunque di indirizzare unasequenza di 65536 byte (compreso il primo, che ha offset paria 0), corrispondenti a 64Kb. 

Configurazioni di RAM superiori (praticamente tutte) devonoperciò essere indirizzate con uno stratagemma: inpratica si utilizzano due registri, rispettivamente dettiregistro di segmento (segment register) e registro dioffset (offset register). Segmento e offset vengonosolitamente indicati in notazione esadecimale, utilizzando idue punti (":") come separatore, adesempio 045A:10BF. Ma non è tutto. 

Se segmento e offset venissero semplicemente affiancati, sipotrebbero indirizzare al massimo 128Kb di RAM: infatti sipotrebbe avere un offset massimo di 65535 byte a partire dalbyte numero 65535. Quello che occorre è invece unvalore in grado di numerare, o meglio di indirizzare, almeno1Mb: i fatidici 640Kb, ormai presenti su tutte le macchine incircolazione, più gli indirizzi riservati al BIOS ealle  schede adattatrici[5]. Occorre, in altre parole,un indirizzamento a20 bit[6]. 

Questo si ottiene sommando al segmento i 12 bit piùsignificativi dell'offset, ed accodando i 4 bit rimanentidell'offset stesso: tale tecnica consente di trasformareun indirizzo segmento:offset in un  indirizzolineare[7]. L'indirizzo seg:off di poco fa(045A:10BF) corrisponde all'indirizzo lineare0565F, infatti 045A+10B = 565 (le prime 3cifre di un valore esadecimale di 4 cifre, cioè a 16bit, corrispondono ai 12 bit piùsignificativi). 

Complicato? Effettivamente... Ma dal momento che le cosestanno proprio così, tanto vale adeguarsi e cercare dipadroneggiare al meglio la situazione. In fondo èanche questione di abitudine.