TL; DR;
Для чого призначений реєстр “FS” / “GS”?
Просто отримати доступ до даних поза сегментом даних за замовчуванням (DS). Точно як ES.
Довге читання:
Тому я знаю, якими мають бути наступні регістри та їх використання:
[...]
Ну, майже, але DS - це не "якийсь" сегмент даних, а стандартний. Якщо всі операції відбувалися за замовчуванням (* 1). Це були всі змінні за замовчуванням - по суті data
та bss
. Це певним чином частина причини, чому код x86 є досить компактним. Усі основні дані, до яких найчастіше отримують доступ (плюс код та стек), знаходяться в межах 16-бітової скороченої відстані.
ES використовується для доступу до всього іншого (* 2), до всього, що перевищує 64 КБ DS. Подібно до тексту текстового процесора, комірок розгорнутого аркуша або даних зображень графічної програми тощо. На відміну від часто передбачуваного, доступ до цих даних не надто великий, тому необхідність префіксу шкодить менше, ніж використання довших полів адрес.
Подібно, це лише незначна неприємність, що DS і ES, можливо, доведеться завантажувати (і перезавантажувати) під час виконання рядкових операцій - це, принаймні, компенсується одним з найкращих наборів інструкцій обробки символів свого часу.
Що насправді шкодить, це те, коли користувацькі дані перевищують 64 КіБ і операції повинні починатися. Хоча деякі операції просто виконуються з одним елементом даних за раз (подумайте A=A*2
), більшості потрібні два ( A=A*B
) або три елементи даних ( A=B*C
). Якщо ці елементи знаходяться в різних сегментах, ES буде перезавантажуватися кілька разів за операцію, додаючи досить багато накладних витрат.
На початку, з невеликими програмами з 8-бітного світу (* 3) і настільки ж малими наборами даних, це не було великою проблемою, але незабаром це стало великим продуктивним горлом - і тим більше справжнім болем у дупі для програмісти (і компілятори). З 386 Intel нарешті отримав полегшення, додавши ще два сегменти, тому будь-яка серія одинарних , двійкових або потрійних операцій з елементами, розподіленими в пам’яті, може відбуватися без постійного перезавантаження ES.
Для програмування (принаймні в збірці) та дизайну компілятора це було суттєвим виграшем. Звичайно, могло бути навіть більше, але з трьома горловиною пляшки в основному не було, тому не потрібно перестаратися.
Назви мудрі букви F / G - це просто алфавітні продовження після Е. Принаймні з точки зору процесора нічого не пов'язано.
* 1 - Використання ES для призначення рядків є винятком, оскільки потрібні просто два сегментні регістри. Без них вони не були б дуже корисними - або завжди потребували префікса сегмента. Що може вбити одну з дивовижних особливостей, використання (неповторюваних) рядкових інструкцій, що призводить до надзвичайної продуктивності завдяки кодуванню одного байта.
* 2 - Отже, заднім числом "Все інше сегмент" було б набагато кращим іменом, ніж "зайвий сегмент".
* 3 - Завжди важливо мати на увазі, що 8086 задумувався лише як запобіжний зазор, поки 8800 не був закінчений, і головним чином призначений для вбудованого світу для утримання клієнтів 8080/85 на борту.