TL, DR;
A quoi sert le registre «FS» / «GS»?
Simplement pour accéder aux données au-delà du segment de données par défaut (DS). Exactement comme ES.
La longue lecture:
Je sais donc ce que sont censés être les registres suivants et leurs utilisations:
[...]
Eh bien, presque, mais DS n'est pas «un» segment de données, mais celui par défaut. Toutes les opérations ont-elles eu lieu par défaut (* 1). C'est là que se trouvent toutes les variables par défaut - essentiellement data
et bss
. C'est en partie la raison pour laquelle le code x86 est plutôt compact. Toutes les données essentielles, qui sont ce qui est le plus souvent consulté, (plus le code et la pile) sont à une distance abrégée de 16 bits.
ES est utilisé pour accéder à tout le reste (* 2), tout au-delà des 64 Kio de DS. Comme le texte d'un traitement de texte, les cellules d'une feuille de calcul, ou les données d'image d'un programme graphique, etc. Contrairement à ce que l'on suppose souvent, ces données ne sont pas autant consultées, donc avoir besoin d'un préfixe fait moins mal que d'utiliser des champs d'adresse plus longs.
De même, ce n'est qu'un inconvénient mineur que DS et ES doivent être chargés (et rechargés) lors d'opérations sur des chaînes - au moins, cela est compensé par l'un des meilleurs jeux d'instructions de gestion de caractères de son époque.
Ce qui fait vraiment mal, c'est lorsque les données utilisateur dépassent 64 Ko et que les opérations doivent commencer. Alors que certaines opérations sont simplement effectuées sur un seul élément de données à la fois (pensez A=A*2
), la plupart nécessitent deux ( A=A*B
) ou trois éléments de données ( A=B*C
). Si ces éléments résident dans différents segments, ES sera rechargé plusieurs fois par opération, ce qui ajoutera une certaine surcharge.
Au début, avec de petits programmes du monde 8 bits (* 3) et des ensembles de données tout aussi petits, ce n'était pas un gros problème, mais c'est rapidement devenu un goulot de performance majeur - et plus encore une vraie douleur dans le cul pour programmeurs (et compilateurs). Avec le 386, Intel a finalement apporté un soulagement en ajoutant deux segments supplémentaires, de sorte que toute opération unaire , binaire ou ternaire en série, avec des éléments étalés en mémoire, pouvait avoir lieu sans recharger ES tout le temps.
Pour la programmation (au moins dans l'assemblage) et la conception du compilateur, c'était tout un gain. Bien sûr, il aurait pu y en avoir encore plus, mais avec trois, le goulot de la bouteille avait pratiquement disparu, donc pas besoin d'en faire trop.
En ce qui concerne les noms, les lettres F / G sont simplement des suites alphabétiques après E. Au moins du point de vue de la conception du processeur, rien n'est associé.
* 1 - L'utilisation de ES pour la destination de la chaîne est une exception, car il suffit de deux registres de segment. Sans cela, ils ne seraient pas très utiles - ou auraient toujours besoin d'un préfixe de segment. Ce qui pourrait tuer l'une des fonctionnalités surprenantes, l'utilisation d'instructions de chaîne (non répétitives) entraînant des performances extrêmes en raison de leur codage à un octet.
* 2 - Donc, avec le recul, 'Everything Else Segment' aurait été une bien meilleure dénomination que 'Extra Segment'.
* 3 - Il est toujours important de garder à l'esprit que le 8086 était uniquement conçu comme une mesure provisoire jusqu'à ce que le 8800 soit terminé et qu'il était principalement destiné au monde embarqué pour garder 8080/85 clients à bord.