TL; DR;
Do czego służy rejestr „FS” / „GS”?
Po prostu dostęp do danych poza domyślnym segmentem danych (DS). Dokładnie jak ES.
Długa lektura:
Wiem więc, jakie mają być następujące rejestry i ich zastosowania:
[…]
Cóż, prawie, ale DS nie jest „jakimś” segmentem danych, ale domyślnym. Czy wszystkie operacje odbywały się domyślnie (* 1). To jest miejsce, w którym znajdują się wszystkie domyślne zmienne - zasadniczo data
i bss
. W pewnym sensie jest to jeden z powodów, dla których kod x86 jest raczej zwarty. Wszystkie istotne dane, które są najczęściej używane (plus kod i stos), znajdują się w odległości 16-bitowej.
ES jest używany do uzyskiwania dostępu do wszystkiego innego (* 2), wszystkiego poza 64 KiB DS. Podobnie jak tekst w edytorze tekstu, komórki arkusza kalkulacyjnego lub dane obrazu w programie graficznym i tak dalej. W przeciwieństwie do często zakładanych danych, dostęp do tych danych nie jest tak duży, więc potrzeba prefiksu jest mniej bolesna niż używanie dłuższych pól adresowych.
Podobnie jest tylko niewielką irytacją, że DS i ES mogą być ładowane (i ponownie ładowane) podczas wykonywania operacji na łańcuchach - jest to przynajmniej kompensowane przez jeden z najlepszych zestawów instrukcji obsługi znaków w tamtych czasach.
To, co naprawdę boli, to sytuacja, gdy dane użytkownika przekraczają 64 KB i trzeba rozpocząć operacje. Podczas gdy niektóre operacje są po prostu wykonywane na pojedynczym elemencie danych na raz (pomyśl A=A*2
), większość wymaga dwóch ( A=A*B
) lub trzech elementów danych ( A=B*C
). Jeśli te elementy znajdują się w różnych segmentach, ES będzie przeładowywana kilka razy na operację, co zwiększy nieco narzut.
Na początku, z małymi programami ze świata 8-bitowego (* 3) i równie małymi zestawami danych, nie było to nic wielkiego, ale wkrótce stało się to wąskim gardłem o dużej wydajności - a tym bardziej prawdziwym bólem w dupie dla programiści (i kompilatorzy). Dzięki procesorowi 386 Intel w końcu zapewnił ulgę, dodając dwa kolejne segmenty, więc każda szeregowa operacja jednoargumentowa , binarna lub trójskładnikowa z elementami rozłożonymi w pamięci mogła odbywać się bez ciągłego przeładowywania ES.
W przypadku programowania (przynajmniej w asemblerze) i projektowania kompilatorów było to spore korzyści. Oczywiście mogło być ich jeszcze więcej, ale przy trzech praktycznie nie było szyjki butelki, więc nie trzeba przesadzać.
Mądre nazewnictwo litery F / G są po prostu kontynuacją alfabetyczną po E. Przynajmniej od punktu projektowania procesora nic nie jest ze sobą powiązane.
* 1 - Wyjątek stanowi użycie ES jako miejsca docelowego łańcucha, ponieważ potrzebne są tylko dwa rejestry segmentowe. Bez nich nie byłoby to zbyt użyteczne - lub zawsze wymagałoby przedrostka segmentu. Co może zabić jedną z zaskakujących funkcji, użycie (nie powtarzających się) instrukcji łańcuchowych, skutkujące ekstremalną wydajnością ze względu na ich kodowanie jednobajtowe.
* 2 - Z perspektywy czasu „Wszystko inne Segment” byłoby o wiele lepszym nazewnictwem niż „Dodatkowy segment”.
* 3 - Zawsze ważne jest, aby pamiętać, że 8086 był pomyślany tylko jako środek zatrzymania przerwy do czasu ukończenia 8800 i był przeznaczony głównie dla świata wbudowanego, aby zatrzymać klientów 8080/85 na pokładzie.