TL; DR;
¿Para qué está destinado el registro “FS” / “GS”?
Simplemente para acceder a datos más allá del segmento de datos predeterminado (DS). Exactamente como ES.
La lectura larga:
Entonces sé cuáles se supone que son los siguientes registros y sus usos:
[...]
Bueno, casi, pero DS no es "algún" segmento de datos, sino el predeterminado. Todas las operaciones se realizaron de forma predeterminada (* 1). Aquí es donde se encuentran todas las variables predeterminadas, esencialmente data
y bss
. De alguna manera, es parte de la razón por la que el código x86 es bastante compacto. Todos los datos esenciales, que es lo que se accede con mayor frecuencia (más el código y la pila) se encuentran a una distancia abreviada de 16 bits.
ES se usa para acceder a todo lo demás (* 2), todo más allá de los 64 KiB de DS. Como el texto de un procesador de texto, las celdas de una hoja de cálculo o los datos de imagen de un programa de gráficos, etc. A diferencia de lo que se supone a menudo, no se accede tanto a estos datos, por lo que necesitar un prefijo duele menos que usar campos de dirección más largos.
Similar, es solo una molestia menor que DS y ES puedan tener que cargarse (y recargarse) al realizar operaciones de cadena; esto al menos se compensa con uno de los mejores conjuntos de instrucciones de manejo de caracteres de su tiempo.
Lo que realmente duele es cuando los datos del usuario superan los 64 KiB y las operaciones deben comenzar. Si bien algunas operaciones se realizan simplemente en un solo elemento de datos a la vez (piense A=A*2
), la mayoría requiere dos ( A=A*B
) o tres elementos de datos ( A=B*C
). Si estos elementos residen en diferentes segmentos, ES se recargará varias veces por operación, agregando bastante sobrecarga.
Al principio, con programas pequeños del mundo de 8 bits (* 3) y conjuntos de datos igualmente pequeños, no fue un gran problema, pero pronto se convirtió en un cuello de botella de rendimiento importante, y más aún en un verdadero dolor de cabeza para programadores (y compiladores). Con el 386 Intel finalmente entregó alivio al agregar dos segmentos más, por lo que cualquier operación unaria , binaria o ternaria en serie, con elementos esparcidos en la memoria, podría tener lugar sin tener que recargar ES todo el tiempo.
Para la programación (al menos en ensamblador) y el diseño del compilador, esto fue una gran ganancia. Por supuesto, podría haber habido aún más, pero con tres el cuello de la botella básicamente se había ido, así que no hay necesidad de exagerar.
Al nombrar las letras F / G son simplemente continuaciones alfabéticas después de E. Al menos desde el punto de vista del diseño de la CPU, no hay nada asociado.
* 1 - El uso de ES para el destino de cadenas es una excepción, ya que simplemente se necesitan dos registros de segmento. Sin ellos, no serían muy útiles, o necesitarían siempre un prefijo de segmento. Lo que podría matar una de las características sorprendentes, el uso de instrucciones de cadena (no repetitivas) que resultan en un rendimiento extremo debido a su codificación de un solo byte.
* 2 - Entonces, en retrospectiva, 'Segmento de todo lo demás' habría sido un nombre mucho mejor que 'Segmento adicional'.
* 3 - Siempre es importante tener en cuenta que el 8086 solo se pensó como una medida provisional hasta que el 8800 se terminó y estaba destinado principalmente al mundo integrado para mantener a los clientes del 8080/85 a bordo.