TL; DR;
Для чего предназначен регистр «FS» / «GS»?
Просто для доступа к данным за пределами сегмента данных по умолчанию (DS). Точно как ES.
Долгое чтение:
Итак, я знаю, какими должны быть следующие регистры и их использование:
[...]
Ну, почти, но DS - это не «какой-то» сегмент данных, а сегмент по умолчанию. Все ли операции выполняются по умолчанию (* 1). Здесь расположены все переменные по умолчанию - по сути data
и bss
. В некотором роде это одна из причин, по которой код x86 довольно компактен. Все важные данные, к которым чаще всего обращаются (плюс код и стек), находятся в пределах 16-битного сокращенного расстояния.
ES используется для доступа ко всему остальному (* 2), за пределами 64 KiB DS. Как текст текстового редактора, ячейки электронной таблицы или графические данные графической программы и так далее. В отличие от часто предполагаемого, к этим данным не так часто обращаются, поэтому необходимость в префиксе вредит меньше, чем использование более длинных полей адреса.
Похоже, это лишь незначительное раздражение, что DS и ES, возможно, придется загружать (и перезагружать) при выполнении строковых операций - это, по крайней мере, компенсируется одним из лучших наборов инструкций по обработке символов того времени.
Что действительно больно, так это когда пользовательские данные превышают 64 КиБ и нужно начинать операции. Хотя некоторые операции просто выполняются с одним элементом данных за раз (подумайте A=A*2
), для большинства требуется два ( A=A*B
) или три элемента данных ( A=B*C
). Если эти элементы находятся в разных сегментах, ES будет перезагружен несколько раз за операцию, что приведет к значительным накладным расходам.
Вначале, с небольшими программами из 8-битного мира (* 3) и такими же небольшими наборами данных, это не было большой проблемой, но вскоре стало основным узким местом в производительности - и, тем более, настоящей головной болью для программисты (и компиляторы). В 386 Intel наконец-то облегчила задачу, добавив еще два сегмента, так что любая последовательная унарная , двоичная или троичная операция с элементами, распределенными в памяти, могла выполняться без постоянной перезагрузки ES.
Для программирования (по крайней мере, в сборке) и проектирования компилятора это было большим преимуществом. Конечно, могло быть и больше, но с тремя горлышками бутылки практически не было, так что не нужно перебарщивать.
В названии буквы F / G - это просто буквенные продолжения после E. По крайней мере, с точки зрения дизайна процессора ничего не связано.
* 1 - Использование ES для назначения строки является исключением, поскольку необходимы просто два сегментных регистра. Без них не было бы много пользы - или всегда нужен префикс сегмента. Это могло убить одну из удивительных особенностей - использование (неповторяющихся) строковых инструкций, что привело бы к экстремальной производительности из-за их однобайтовой кодировки.
* 2 - Итак, оглядываясь назад, «Сегмент всего остального» было бы лучше, чем «Дополнительный сегмент».
* 3 - Всегда важно помнить, что 8086 предназначалась только как временная мера, пока 8800 не была закончена, и в основном предназначалась для мира встраиваемых систем, чтобы поддерживать клиентов 8080/85.