TL; DR;
Wofür ist das Register „FS“ / „GS“ vorgesehen?
Einfach, um auf Daten außerhalb des Standarddatensegments (DS) zuzugreifen. Genau wie ES.
Die lange Lektüre:
Ich weiß also, wie die folgenden Register und ihre Verwendung aussehen sollen:
[...]
Nun, fast aber DS ist nicht 'irgendein' Datensegment, sondern das Standard. Wurden alle Operationen standardmäßig durchgeführt (* 1)? Hier befinden sich alle Standardvariablen - im Wesentlichen data
und bss
. Dies ist in gewisser Weise ein Grund dafür, dass x86-Code ziemlich kompakt ist. Alle wesentlichen Daten, auf die am häufigsten zugegriffen wird (plus Code und Stapel), befinden sich innerhalb einer 16-Bit-Kurzschriftentfernung.
ES wird verwendet, um auf alles andere (* 2) zuzugreifen, alles über die 64 KiB von DS hinaus. Wie der Text eines Textverarbeitungsprogramms, die Zellen einer Tabelle oder die Bilddaten eines Grafikprogramms und so weiter. Anders als oft angenommen, wird auf diese Daten nicht so oft zugegriffen, sodass die Notwendigkeit eines Präfixes weniger schmerzt als die Verwendung längerer Adressfelder.
Ähnlich ist es nur ein kleiner Ärger, dass DS und ES möglicherweise geladen (und neu geladen) werden müssen, wenn Zeichenfolgenoperationen ausgeführt werden - dies wird zumindest durch einen der besten Zeichensatz-Befehlssätze seiner Zeit ausgeglichen.
Was wirklich weh tut, ist, wenn Benutzerdaten 64 KB überschreiten und der Betrieb aufgenommen werden muss. Während einige Vorgänge jeweils nur für ein einzelnes Datenelement ausgeführt werden (think A=A*2
), erfordern die meisten zwei ( A=A*B
) oder drei Datenelemente ( A=B*C
). Wenn sich diese Elemente in verschiedenen Segmenten befinden, wird ES mehrmals pro Vorgang neu geladen, was einen erheblichen Overhead verursacht.
Am Anfang war es mit kleinen Programmen aus der 8-Bit-Welt (* 3) und ebenso kleinen Datenmengen keine große Sache, aber es wurde bald zu einem großen Flaschenhals - und vor allem zu einem echten Ärgernis für Programmierer (und Compiler). Mit dem 386 sorgte Intel schließlich für Erleichterung, indem zwei weitere Segmente hinzugefügt wurden, sodass jede unäre , binäre oder ternäre Serienoperation mit im Speicher verteilten Elementen stattfinden konnte, ohne ES ständig neu zu laden.
Für die Programmierung (zumindest in der Assembly) und das Compiler-Design war dies ein ziemlicher Gewinn. Natürlich hätte es noch mehr geben können, aber bei drei war der Flaschenhals im Grunde genommen weg, so dass es nicht nötig war, es zu übertreiben.
In Bezug auf die Benennung sind die Buchstaben F / G einfach alphabetische Fortsetzungen nach E. Zumindest vom Standpunkt des CPU-Designs ist nichts zugeordnet.
* 1 - Die Verwendung von ES als Zeichenfolgenziel ist eine Ausnahme, da lediglich zwei Segmentregister benötigt werden. Ohne wären sie nicht sehr nützlich - oder benötigen immer ein Segmentpräfix. Was eines der überraschenden Merkmale zunichte machen könnte, ist die Verwendung von (nicht sich wiederholenden) Zeichenfolgenbefehlen, die aufgrund ihrer Einzelbyte-Codierung zu einer extremen Leistung führen.
* 2 - Im Nachhinein wäre "Alles andere Segment" eine viel bessere Benennung gewesen als "Zusätzliches Segment".
* 3 - Es ist immer wichtig zu bedenken, dass die 8086 nur als Stop-Gap-Maßnahme bis zur Fertigstellung der 8800 gedacht war und hauptsächlich für die Embedded-Welt gedacht war, um 8080/85-Kunden an Bord zu halten.