Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекцій із Системного програмування та...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
786.31 Кб
Скачать

2. Сегментні регістри по домовленості

Згідно описаної схеми сегментування адрес, заміну абсолютних адрес на адресні пари треба виконувати всіма командами які мають операнд-адресу. Але розробники ПК придумали спосіб, який дозволяє уникнути виписування таких пар в більшості команд. Суть його в тому, що заздалегідь домовляються про те, який сегментний регістр на який сегмент пам’яті буде вказувати, і що в командах задається тільки зміщення: не вказаний явно сегментний регістр автоматично відновлюється відповідно цій домовленості. І лише за необхідності порушити цю домовленість потрібно повністю вказувати адресну пару.

Що таке домовленість?

Вважається, що регістр CS завжди вказує на початок області пам’яті, в якій розміщені команди програми (ця область називається сегментом команд або сегментом кодів), і тому при посиланні на клітини цієї області регістр CS можна не вказувати явно, він передбачається по замовчуванню. (Відмутимо, що абсолютна адреса, яка підлягає виконанню, завжди задається парою CS:IP: в лічильнику команд IP завжди знаходиться зміщення цієї команди відповідно адреси із регістра CS.) Аналогічно передбачається, що регістр DS вказує на сегмент даних (область пам’яті з константами, змінними та іншими величинами програми), і тому у всіх посиланнях на цей сегмент регістр DS можна явно не вказувати, т.я. він передбачається по замовчуванню. Регістр SS вказує на стек – область пам’яті, доступ до якої здійснюється за принципом "останній записаний перший прочитаний", і тому всі посилання на стек, в який явно не вказаний сегментний регістр, по замовчуванню сегментуються по регістру SS. Регістр ES вважається вільним, він не прикріплений ні до жодного сегменту пам’яті і його можна використати за власним бажанням; частіше всього він використовується для доступу до даних, які не розмістилися або свідомо не були розміщенні в сегменті даних.

З урахуванням такого розподілу ролей сегментних регістрів машинні програми зазвичай будуються так: всі команди програми розміщуються в одному сегменті памяті, початок якого заноситься в СS, а всі данні розміщуються в іншому сегменті, початок якого заноситься в регістр DS; якщо потрібен стек, то під нього відводиться третій сегмент памяті, початок якого записується в регістр SS. Після цього практично у всіх командах можна вказувати не повні адресні пари, а лише зміщення, т.я. сегментні регістри в цих парах будуть відновлюватися автоматично.

Але тут виникає таке питання: як за зміщенням визначити, на який сегмент памяті воно вказує? В загальних рисах відповідь така: посилання на сегмент команд можуть бути лише в командах переходу, а посилання практично у всіх інших командах (крім рядкових і стекових) – це посилання на сегмент даних. Наприклад, в команді пересилки

MOV AX,X

Імя X сприймається як посилання на дану, а тому автоматично відновлюється за адресною парою DS:X. В команді ж безумовного переходу за адресою, яка знаходиться в регістрі BX,

JMP BX

Абсолютна адреса переходу визначається парою CS:[BX].

Отже, якщо в посиланні на будь-яку клітину памяті не вказаний явний сегментний регістр, то цей регістр береться по замовчуванню. Явно ж сегментні регістри потрібно вказувати, тільки якщо з якихось причин регістр по замовчуванню не підходить. Якщо, наприклад, команді пересилки нам потрібно послатися на стек, тоді нас вже не буде задовольняти домовленість про те, що по замовчуванню операнд команди MOV сегментуються за регістром DS, і тому ми зобов’язані явно вказати інший регістр – в нашому випадку регістр SS, т.я. саме він вказує на стек:

MOV ah,ss:x

Але такі випадки зустрічаються рідко і тому в командах, як правило, вказуються лише зміщення.

Відмітимо, що в MASM сегментний регістр записується в самій команді безпосередньо перед зміщенням (ім’ям змінної, міткою і т.п), Але на рівні машинної мови ситуація дещо інша. Існує 4 спеціальні одно байтові команди, які називаються префіксами заміни сегмента (які позначаються як CS:, DS:, SS: та ES:). Вони ставляться перед командою, операнд-адреса якої повинна бути просегментована по регістру, який відрізняється від регістра, передбаченого по замовчуванню. Наприклад, наведена вище символічна команда пересилки – це дійсно дві машинні команди

SS:

MOV ah,x