PROBLEMA Indirizzamento a 20 bit del 8086

  • Autore discussione Autore discussione fan89
  • Data d'inizio Data d'inizio
Pubblicità

fan89

Nuovo Utente
Messaggi
56
Reazioni
1
Punteggio
26
Salve l' intel 8086 ha registri a 16 bit ma uno spazio di indirizzamento nella memoria di 20 bit. Questo è possibile perchè vado a moltiplicare il SEGMENT ADRESS per 16 e sommandogli l' EFFETIVE ADRESS, ottenendo così l' indirizzo fisico effettivo. Tutto questo succede nel datapath, giusto? Ma questo indirizzo a 20 bit dove lo vado a salvare se i registri dell' 8086 sono solo a 16 bit.
 
Ovviamente il risultato viene stoccato in un apposito registro ( non accessibile al programmatore ) della cpu. Il programmatore DEVE usare segmento+offset quando lavora con la memoria, il calcolo e la conversione a 20 bit è un'affare interno della cpu e il programmatore non è tenuto ad interessarsene.
 
Ciao pabloski, quindi l' indirizzo a 20 bit viene salvato in un registro segreto e dopo istradato sul bus indirizzi, così che la cella indicata possa essere pronta per un operazione di lettura o un operazione di scritture.
 
Ciao pabloski, quindi l' indirizzo a 20 bit viene salvato in un registro segreto e dopo istradato sul bus indirizzi, così che la cella indicata possa essere pronta per un operazione di lettura o un operazione di scritture.

registro segreto? hai capito male.
l'8086 ha un bus dati a 20bit, quindi è in grado di indirizzare fino a 2^20 byte (1048576 il famoso mega),
ma se i registri sono tutti a 16bit (quelli segreti sono nei film di harry potter), giustamente uno si chiede
come avviene l'indirizzamento?

per ovviare al famoso problema strutturale si è pensato ad uno stratagemma, ovvero
utilizzare l'accoppiata CS:IP per ottenere un indirizzo da 20 bit. Come?
cs:ip in teoria sono 32 bit, l'8086 per ottenerne uno a 20 shifta a sinistra di
4 bit cs e successivamente gli somma ip. Ti chiedi, l'indirizzo dov'è memorizzato?
la risposta la sai, in due registri, uno per il segmento e l'altro per lo scarto,
ricorda 2 da 16 non sono 32 ma 20.
 
@Trepiedi: Mi riferivo ovviamente al Memory Address Register. E' quello il registro, non accessibile dal modello di programmazione, a cui mi riferivo.
 
Ciao Trepiedi, scusa se rispondo solo adesso ma mi sono dimenticato di controllare se qualcuno a risposta alla mia domanda. Comunque, per calcolare,
l' indirizzo a 20 bit devo shiftare il CS di 4 bit a sinistra e poi sommargli successivamente IP, Però in base al funzionamento del datapath io dovrò salvare da qualche parte l' indirizzo che ho shiftato. Ma dove posso salvare l' indirizzo shiftato, dato che i registri solo di 16 bit?
 
Ma dove posso salvare l' indirizzo shiftato, dato che i registri solo di 16 bit?

Tu non lo salvi da nessuna parte, lo mantieni scisso in segmento e offset. La CPU ovviamente lo salva da qualche parte e questa parte si chiama Memory Address Register. Il punto è che tu ( programmatore ) il MAR non lo vedi e nemmeno ci puoi accedere. Si tratta di un registro che non fa parte del modello di programmazione.
 
Ultima modifica:
non devi fare niente; per memorizzare un indirizzo a 20 bit usi due registri da 16;
quell'operazione dello shifting ti serve solo per capire perché con 32 bit a disposizione
indirizzi solo fino a un mega;

ti faccio un esempio:

CS contiene 3FA8 (0011 1111 1010 1000)
IP contiene D017 (1101 0000 0001 0111)

CS:IP dovrebbe essere un indirizzo da 32 bit, ma in realtà corrisponde a uno da 20
infatti l'indirizzo reale è: 0100 1100 1010 1001 0111

perché CS shiftato diventa: 0011 1111 1010 1000 0000
e sommandogli IP diventa quello di cui sopra.
L'accoppiata CS:IP la memorizzi dove vuoi, tenendo però presente che in realtà corrisponde a un'altra cosa.
 
Pubblicità
Pubblicità
Indietro
Top