DOMANDA Generazione indirizzo fisico Intel8086

Matteo34

Nuovo Utente
104
3
CPU
i5-10500 3.2Ghz
Dissipatore
Non specificato
Scheda Madre
Non specificata
HDD
M.2 251GB e M.2 500GB
RAM
16GB DDR4 2666mhz
GPU
Grafica Intel® UHD 630
Audio
Non specificata
Monitor
1920x1080 27"
PSU
Non specificato
Case
Non specificato
Periferiche
Nono specificato
Net
Eolo
OS
Ubuntu
Scusate, non ho ben capito a cosa serve la generazione degli indirizzi fisici e come avviene, qualcuno me la potrebbe spiegare?
Per esempio per quale motivo per inizzializare il registro SP(stack pointer) il processore esegue l'offset tra il reegistro di segmento SS e il registro puntatore SP (SS:SP), non basterebbe copiare il valore del registro SS nel registro SP così da contenere l'indirizzo di end of stack, se non sbaglio lo stack viene inizializzato da indirizzi bassi verso alti no?
Sono in totale confusione
 

pabloski

Utente Èlite
2,868
916
Non è questione di direzione, ma di dimensione. I registri dell'8086 erano a 16 bit, cioè max 64K indirizzabili. E' chiaro che non sarebbero andati lontano.

La furbata fu di usare i segmenti per allargare lo spazio d'indirizzamento fisico a 20 bit. In pratica si prende il valore del registro segmento, lo si shifta di 4 bit a sinistra e il risultato si somma al registro indice/puntatore.

Così si può costruire un indirizzo fisico di 20 bit ( 1Mega ) a partire da due registri a 16 bit.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Integro con alcuni altri elementi il post di pabloski.

Il problema è dovuto di fatto al bus indirizzi che è a 20bit, mentre il bus dati è a 16bit (e i registri sono a 16bit).

Il registro SP (così come gli altri) è a 16bit. Quindi non puoi indirizzare memoria superiore a quella che puoi contenere in 16bit.

L'operazione che avviene è quella spiegata da pabloski, in pratica se hai un segmento 1234h e un offset 0005h, l'indirizzo fisico sarà (1234h * 10h) + 0005h = 12345h (al posto della moltiplicazione, puoi appunto usare lo shift). In questo modo l'indirizzo fisico supera la limitazione dovuta ai registri: visto che l'address bus è a 20bit, facendo così, si è in grado di sfruttare tutto l'address bus.
Da notare che i segmenti sono anche parzialmente sovrapposti.

Ad ogni modo, lo stack "cresce verso il basso" (l'indirizzo iniziale è quindi alto, e viene decrementato con l'inserimento dei valori).
 
U

Utente cancellato 371741

Ospite
E poi arrivo' la memoria estesa col gate a20, che estendeva al 21esimo bit.

La modalita real-mode non e' esclusiva di <=286, il processore parte ancora in real mode, il bios puo passare in protected->long per eventuali test di memoria ma poi deve tornare in real-mode

Quello che si sovrappone (somma) sono i 12 bit centerali dei 20.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!