ASM [HELP] Segment Registers

Stato
Discussione chiusa ad ulteriori risposte.

text

Utente Palladium
28 Dicembre 2010
3,453
197
1,166
1,630
So che non sono più utilizzati, o almeno che non vengono utilizzati come una volta (16-bit), potreste darmi una bella spiegazione di come e se vengono utilizzati oggi? Grazie
 
Nelle architetture IA-32 e IA-64 (intel 32 e 64 bit rispettivamente) i registri di segmento, contrariamente agli altri registri, non sono stati ampliati ma hanno mantenuto la loro dimensione originaria di 16 bit.

Il loro utilizzo dipende dal modello di memoria che si sta usando, ci sono 3 casi:

memoria segmentata
Ovvero la modalita' dell'8086 e delle CPU a 16 bit in generale, in questa' modalita' la memoria e' divisa in segmenti quindi i registri di segmento svolgono la loro funzione originale, vengono usati per puntare ai vari segmenti in uso dal programma (solitamente almeno CS per puntare al code segment, DS per il data segment e SS per lo stack segment, anche se vi sono altri 3 registri ovvero ES,FS e GS)

memoria flat (32 bit)
I segmenti di registro contengono dei selettori di segmento che puntano a segmenti sovrapposti che iniziano all'inizio dei 4Gb di spazio indirizzabile del programma.

64 bit
Qualunque sia il valore della base del segmento associata ai segmenti puntati da CS,DS,SS ed ES essi vengono trattati come se avessero valore 0 creando uno spazio flat per dati,codice e stack.
Cio' non vale per i registri FS e GS che possono essere usati nel calcolo di indirizzi lineari o per altri scopi.

In sostanza la grossa differenza fra 32 e 64 bit e' che in modalita' 32 bit i registri di segmento puntano all'inizio dello spazio indirizzabile dal programma, ovvero all'inizio dei 4Gb a sua disposizione, che pero' potrebbero essere disposti ovunque in memoria mentre in modalita' 64 bit i registri di segmento vengono trattati come se la base dei segmenti associati fosse 0, in altre parole puntano a dei segmenti che iniziano all'inizio della memoria disponibile.

Per ulteriori informazioni l'Intel User Manual, volume 1, capitolo 3.4.2 segment registers contiene tutte le informazioni che possono servirti :)

immagini tratte dal capitolo sopracitato
03415-e77a95fe-d2a1-408f-8bad-e4ce23922424.png
 
Quindi in parole povere a 32bit tutti i segment registers puntano all'inizio della memoria utilizzabile dal programma e a 64bit puntano all'inizio di TUTTA la memoria?

Grazie mille per la risposta, ma la domanda ora mi porge spontanea, a 64bit come fa il programma a sapere dove stanno in realtà i suoi dati?
 
Ultima modifica:
Come al solito L'Intel user manual ci fornisce tutte le informazioni che possiamo desiderare, volume 1, capitoli 3.3.3, 3.3.4 e 3.3.7.

32 bit
Ci sono 3 modelli per la memoria:

flat
La memoria e' vista dal programma come uno spazio continuo, chiamato linear address space, con indirizzi da 0 a 231-1, un indirizzo per uno specifico byte in questo spazio e' chiamato linear address.
effective address=indirizzo a cui iniziano i 4Gb+linear address

segmented
La memoria e' vista dal programma come un gruppo di spazi indirizzabili indipendenti chiamati segmenti, per accededere ad un byte in uno di questi segmenti viene utilizzato un logical address composto da un selettore di segmento e da un offset (spiazzamento), il selettore di segmento identifica il segmento a cui accedere e l'offset identifica un byte di quel segmento.
I programmi in esecuzione su processori IA-32 possono indirizzare fino a 16383 segmenti, ogunno dei quali puo' essere fino a 232 byte in ampiezza.

Internamente i vari segmenti sono mappati nello spazio lineare del processore che si preoccupa di convertire gli indirizzi logici in lineari

real-mode
E' una modalita' utilizzata per mantenere la compatibilita' verso il basso con l'8086, la memoria e' divisa in segmenti da 64Kbyte l'uno (non proprio tutti quanti ma dettagli), il linear address space e' composto da 220 byte (infatti l'address bus dell'8086 ha 20 linee)

03415-2a50599b-d0f5-476d-9c0f-bb793e076eec.png



64 bit
I processori IA-64 supportano uno spazio indirizzabile piu' ampio di 64Gb, il processore puo' inidirizzare linear address a 64 bit, anche se, da implementazione ad implementazione, questo spazio potrebbe essere inferiore.
In modalita' a 64 bit la segmentazione e' solitamente (ma non totalmente a causa dei registr FS e GS che possono essere usati come segment register) disabilitata e la base dei segmenti e' posta a 0. Questo significa che, in modalita' a 64 bit, un linear address coincide col corrispettivo effective address


La ho fatta un po' lunga ma era difficile da spiegare altrimenti, spero di non essermi fatto sfuggire delle imprecisioni :(
In parole povere l'address bus delle CPU IA-64 puo' indirizzare fino a 264=1.89e19 byte, quindi un solo indirizzo lineare a 64 bit e' piu' che sufficente ad indirizzare una specifica locazione in memoria. Poi sono l'assembler e il linker che si preoccupano di predisporre il tuo programma in modo che quando venga caricato in memoria gli indirizzi risultino giusti.
 
Mi dispiace ma la bibbia ha fallito, la ricerca di "love" nell'Intel user manual non ha prodotto risultati.
Comunque possiamo discuterne, tanto la mia ragazza non capisce l'italiano e non puo' leggere :asd:

In ogni caso tornando in-topic gli address in modalita' a 64 bit sono comunque composti da un segment a 16 bit+offset a 64 bit ma solitamente la componente segment vale 0, a meno che, come gia' detto, non si usino i registri FS e GS.

C'e invece un'altra modalita' di indirizzamento, peculiare della modalita' a 64 bit, chiamata RIP relative addressing (indirizzamento relativo al RIP) dove RIP e' il registro instruction pointer che punta alla prossima istruzione da eseguire (l'estensione a 64 bit del registro EIP nelle architetture IA-32), che consiste nello specificare l'indirizzo della prossima istruzione da eseguire aggiungendo al RIP un offset signed a 32 bit.
(cio' non toglie che dopo aver aggiunto l'offset l'indirizzo lineare che si ottiene coincide col corrispondente indirizzo effettivo)
 
Grazie mille, sei stato molto esaustivo, chiudo e ti invio un pm col mio nome skype.
 
Stato
Discussione chiusa ad ulteriori risposte.