TL; DR;
A cosa è destinato il registro “FS” / “GS”?
Semplicemente per accedere ai dati oltre il segmento di dati predefinito (DS). Esattamente come ES.
La lunga lettura:
Quindi so quali dovrebbero essere i seguenti registri e i loro usi:
[...]
Beh, quasi, ma DS non è "un po '" di segmento di dati, ma quello predefinito. Tutte le operazioni sono state eseguite per impostazione predefinita (* 1). Qui si trovano tutte le variabili predefinite, essenzialmente data
e bss
. È in qualche modo parte del motivo per cui il codice x86 è piuttosto compatto. Tutti i dati essenziali, a cui si accede più spesso (più codice e stack), si trovano a una distanza abbreviata di 16 bit.
ES è utilizzato per accedere a tutto il resto (* 2), tutto oltre i 64 KiB di DS. Come il testo di un elaboratore di testi, le celle di un foglio di calcolo oi dati dell'immagine di un programma di grafica e così via. A differenza di quanto spesso si presume, questi dati non sono molto accessibili, quindi la necessità di un prefisso fa meno male rispetto all'utilizzo di campi indirizzo più lunghi.
Allo stesso modo, è solo un piccolo fastidio che DS ed ES debbano essere caricati (e ricaricati) quando si eseguono operazioni sulle stringhe - questo almeno è compensato da uno dei migliori set di istruzioni per la gestione dei caratteri del suo tempo.
Ciò che fa veramente male è quando i dati utente superano i 64 KiB e le operazioni devono essere avviate. Mentre alcune operazioni vengono eseguite semplicemente su un singolo elemento di dati alla volta (pensa A=A*2
), la maggior parte richiede due ( A=A*B
) o tre elementi di dati ( A=B*C
). Se questi elementi risiedono in segmenti diversi, ES verrà ricaricato più volte per operazione, aggiungendo un bel po 'di overhead.
All'inizio, con piccoli programmi dal mondo a 8 bit (* 3) e set di dati altrettanto piccoli, non era un grosso problema, ma presto divenne un collo di bottiglia per le prestazioni principali - e ancor più un vero rompicoglioni per programmatori (e compilatori). Con il 386 Intel ha finalmente fornito sollievo aggiungendo altri due segmenti, quindi qualsiasi operazione unaria , binaria o ternaria in serie, con elementi sparsi in memoria, potrebbe avvenire senza ricaricare ES tutto il tempo.
Per la programmazione (almeno in assembly) e la progettazione del compilatore, questo è stato un bel vantaggio. Certo, avrebbe potuto esserci anche di più, ma con tre il collo di bottiglia era praticamente sparito, quindi non c'è bisogno di esagerare.
Dal punto di vista del nome, le lettere F / G sono semplicemente continuazioni alfabetiche dopo E. Almeno dal punto di vista della progettazione della CPU non è associato nulla.
* 1 - L'utilizzo di ES per la destinazione della stringa è un'eccezione, poiché sono necessari semplicemente due registri di segmento. Senza non sarebbero molto utili o avrebbero sempre bisogno di un prefisso di segmento. Il che potrebbe uccidere una delle caratteristiche sorprendenti, l'uso di istruzioni stringa (non ripetitive) con conseguente prestazioni estreme a causa della loro codifica a byte singolo.
* 2 - Quindi, col senno di poi, "Tutto il resto" sarebbe stato un nome migliore rispetto a "Segmento extra".
* 3 - È sempre importante tenere presente che l'8086 era inteso solo come misura di stop gap fino a quando l' 8800 non era finito e principalmente destinato al mondo embedded per mantenere i clienti 8080/85 a bordo.