DOMANDA codice operativo e indirizzo operando

Pubblicità
2^16 * 2^16 = 2^32. Ma è solo nella teoria, nel senso che il bus rimane a 20bit con 8086. La coppia logica viene per forza di cose trasformata nell'indirizzo a 20bit (segmento * 16 + offset, è ottieni l'indirizzo 20bit).
Quindi al massimo supporta 1MB.

Con un 32bit hai il bus a 32bit, quindi al massimo indirizzi 32bit di memoria, ovvero 4GB (appunto il max che vedi con un 32bit).

Qualsiasi altra astrazione ti inventi sopra non cambia quello che c'è sotto al cofano, perché quello è fisico.
Quindi per chiudere io con registro di indirizzi a 20 bit al massimo avró una ram di dimensione 2^20’piu grande non serve in quanto non sarà utilizzata, giusto?
Grazie ancora,
Marco
 
Quindi per chiudere io con registro di indirizzi a 20 bit al massimo avró una ram di dimensione 2^20’piu grande non serve in quanto non sarà utilizzata, giusto?
Grazie ancora,
Marco

Provo a metterla in altri termini: tu hai un hardware che ti consente di indirizzare 1MB di memoria perchè hai 20 linee (20bit, quindi). I tuoi registri però sono a 16bit, quindi con un singolo registro non puoi andare oltre a 2^16, per forza di cose.
A questo punto è stato introdotto quel meccanismo detto nei post precedenti, dove usi la coppia Segmento:Offset. Questa coppia logica viene trasformata per poter accedere all'indirizzo effettivo, esprimibile in 20 bit: quindi viene fatto (Segmento * 16) + Offset.
Con questo stratagemma anche se hai registri a 16bit, riesci a indirizzare 20bit.

Qiundi si, per questo motivo, avendo 20bit al massimo, il limite di memoria indirizzabile è proprio 1MB. Considera che in quegli anni 1MB era molto.

Anche 4GB per un 32bit erano molti, pensando ai tempi di 386. Solo per fare un esempio, un Notebook che acquistai io nel 2006/2007 disponeva di ben 1GB di RAM (l'avevo espanso a ben 1.2GB, in quanto non potevo andare oltre).
Questo per dire che circa 12-15 anni fa avere 4GB di RAM era comunque la norma e forse anche un "di più".

Anche in questo caso il limite è dettato sempre dall'hw: 32bit sono come visto sopra 2^32, quindi 4GB. Se hai meno RAM non è un problema, ovviamente.

Con i 64bit hai invece la bellezza di 16EB (Exabytes), che è una cifra a dir poco inimmaginabile (non è tutto usato in realtà, ma si rientra nel discorso dell'implementazione della memoria virtuale, che si limita a uno spazio di indirizzamento di 48bit).

Comunque inizia dal testo sugli OS, vedrai che piano piano inizerai ad avere più elementi per comprendere meglio quanto stiamo dicendo in questo topic.
 
Quindi per chiudere io con registro di indirizzi a 20 bit al massimo avró una ram di dimensione 2^20’piu grande non serve in quanto non sarà utilizzata, giusto?

Temo tu stia ancora confondendo il fisico col logico.

Fisico = quanti fili ha il bus indirizzi. E' una cosa materiale.
Logico = quanti bit hanno i registri usati per contenere gli indirizzi a cui accedere. E' una cosa immateriale. Riguarda i programmi.

Ovviamente il limite invalicabile è la dimensione del bus fisico. Se hai 20 fili, è impossibile che tu possa indirizzare 2^32 locazioni. Come potresti fare? 20 fili = 20 bit rappresentabili. Gli altri 12 chi ce li mette? Se metti venti 1 di fila, arriva al massimo a 2^20 = 1 Mega.

A meno di avere un secondo bus indirizzi ( e sarebbe folle ) non vedo come tu possa indicare gli altri 12 bit.

E un discorso analogo si applica lato software ai registri. Un registro a 16 bit ( se metti tutti 1 ) può rappresentare al massimo il numero 2^16 = 64K.

Ma che succede se il tuo processore è stato creato in modo da riempire il bus indirizzi col contenuto preso da 2 registri diversi? Pensaci. Hai, per esempio, DI che è 16 bit. Hai CS che è pure lui 16 bit. Se li accodi?

Cioè

[CS][DI] -> hai una stringa di 32 bit. I 16 di DI a destra e i 16 di CS a sinistra. Di fatto è un valore a 32 bit.

E se invece fai una cosa così?

DI = 1011011101110111
CS = 0010001000001001

Il processore ( quindi l'hardware, non la parte software ) shifta CS di 4 bit verso sinistra, ottenendo 00100010000010010000. Notato che il valore è diventato di 20 bit? E si, non può essere contenuto in CS e infatti quel numero non viene salvato in CS, ma in un apposito registro del processore ( nascosto al programmatore ) che è di 20 bit ( la stessa dimensione del bus indirizzi ).

Adesso sommi CS e DI.

00100010000010010000 +
1011011101110111
=====================
00101101100000000111 --> questo viene messo sul bus indirizzi....un numero a 20 bit!!

L'indirizzamento x86 in modalità reale funziona così. In modalità protetta i registri vengono usati in un altro modo e questo ragionamento non è applicabile.

p.s. parlando di libri, a suo tempo usai "8086-8088 programmazione" di James Coffron, Jackson libri. La sezione sugli indirizzamenti spiega molto meno questa cosa della costruzione dell'indirizzo fondendo 2 registri diversi.
 
Inoltre perché con 32 bit il massimo è 4Gb di indirizzamento, non si può applicare il metodo fatto nella cpu 8086? ovvero che anche avendo 16 bit si riesce a indirizzare fino a 4 GB?
Marco
bella domanda.
I realtà si è fatto molto di più, la gestione della memoria ha subito cambiamenti e miglioramenti radicali nel corso degli anni. Di fatto, ancora adesso 4GB come limite va ancora benissimo nella maggior parte delle situazioni, è un sacco di dati che ci puoi mettere dentro, e le cpu a 64bits sono uscite prima che si chiedesse più di 4GB. Tieni conto anche che ogni trucco ha un prezzo, in questo caso la velocità di esecuzione di un programma viene seriamente penalizzata in quanto ogni accesso di memoria viene effettuato mediante una trasformazione del valore dell’indirizzo, per questo motivo tale trasformazione viene effettuata in hardware mediante un componente noto come Memory Management Unit.
 
Pubblicità
Pubblicità
Indietro
Top