Важливою особливістю мікропроцесору INTEL є спосіб формування фізичної адреси при зверненні до пам’яті. Так як внутрішні регістри мікропроцесора шістнадцяткові, а шина адреси має ширину 20 біт, для формування 20-розрядної фізичної адреси пам’яті використовуються два компоненти: сегмент адреси та зміщення адреси. Фізичну адресу записують парою цих значень, розділених двокрапкою: segment:offset, де segment та offset ‑ будь-які цілі числа без знаку. (Надалі при запису фізичних адрес символ h буде відноситись як до сегменту, так і до зміщення). Фізична адреса утворюється таким чином:
Ä значення сегменту адреси зміщується на 4 біта ліворуч з заповненням розрядів праворуч нулями;
Ä до утвореного 20-бітового значення добавляється значення зміщення адреси. При виникненні переповнення беруть лише молодші п’ять 16-кових цифр результату.
Наприклад, адреса 40:1Ch відповідає фізичній адресі 0041Ch:
|
0040h |
¬ зміщення ліворуч |
+ |
00400h |
|
001Ch |
|
|
|
0041Ch |
|
Одна і та ж фізична адреса може бути отримана з самих різних комбінацій сегменту та зміщення адреси. Наприклад, фізичний адресі 0041Ch відповідають наступні пари: 0000:041Ch; 0041:000Ch; 0020:021Ch та інші.
Сегментна частина адреси називається номером параграфа адреси або просто параграфом адреси. Параграф в архітектурі Intel ‑ це кратна 16 байтам межа пам’яті. Зрозуміло, що при будь - якому значенні segment фізична адреса segment:0 кратна 16 (або буде містити 0 в молодшому розряді 16-річного вигляду фізичної адреси).
При формуванні фізичної адреси в якості сегментної частини адреси мікропроцесор використовує значення, що записані в сегментних регістрах. Сегментні регістри мікропроцесору мають чітку “спеціалізацію”.
Значення в регістрі CS, як правило, використовується при формуванні фізичної адреси наступної інструкції, що виконується. По завершенню цієї інструкції CS:IP задає адресу наступної команди. За цією адресою мікропроцесор зчитує її з оперативної пам’яті, виконує дії, що задає код операції, та формує нові значення CS та IP. Цей процес триває, поки не відключиться електропостачання або не зустрінеться інструкція апаратного останова HALT. Лише невелика кількість інструкцій змушує процесор змінити значення кодового сегментного регістру.
До них належать “далекий” (FAR) виклик процедури з поверненням (CALL FAR, CALL DWORD PTR), “далекий” безумовний перехід (JPM FAR, JPM DWORD PTR), програмне переривання (INT), повернення з “далекої” процедури (RET FAR), повернення з перериванням (IRET). При виконанні переходів нове значення для CS може або бути записаним в коді самої машинної команди (так званий перехід з прямою адресацією), або зберігатися в комірці оперативної пам’яті (так званий перехід з непрямою адресацією). При виконанні інструкцій CALL FAR, CALL DWORD PTR, INT ‑ поточне значення CS запам’ятовується разом з IP в стеці, а здобувається звідти та записуються знову в CS та IP інструкціями повернення RET або IRET. При виконанні інструкції INT в стеці додатково зберігається й слово стану процесора (регістр прапорів).
Значення в регістрі DS задає сегмент фізичної адреси даних, що приймають участь в операції. Значення зміщення адреси або джерело їх отримання задає код інструкції. Якщо використовується пряма адресація, зміщення записано в самій інструкції. При непрямій адресації зміщення формується із значень, що записані в інших регістрах процесора, наприклад додавання значень в регістрі BX з значенням в регістрі SI або DI. Однак є випадки, коли в якості сегментованої частини адреси даних використовуються інші сегментні регістри, а не лише DS. По-перше, якщо перед кодом інструкції є спеціальний префікс перевизначення сегменту (на асемблері він записується CS:, ES:, DS:, SS), то при формуванні фізичної адреси даних в якості сегментної її частини процесор приймає значення заданого явно сегментного регістра. По-друге, будь-яка непряма адреса операнда через регістр BP “змушує“ процесор використовувати при формуванні фізичної адреси даних не DS, а сегментний регістр SS. Останнє дуже часто використовується для доступу до даних, що записані в стек (одним з прикладів є стандартний метод доступу до параметрів Сі-функції).
Значення в регістрі ES використовується для формування фізичної адреси в двох
випадках:
1) якщо в машинній інструкції заданий префікс перевизначення сегменту ES:;
2) при виконанні машинних інструкцій маніпуляції ланцюгами байтів або слів (ланцюгових примітивів). В цьому випадку фізична адреса задається парою ES:DI і є адресою приймача байтів та слів. Джерелом служить в залежності від примітиву, що виконується, байт або слово, адреса якого в пам’яті задається парою DS:SI.
Значення в регістрі SS задає сегментну частину адреси для даних в стеці. При цьому в якості зміщення приймається значення регістра SP, або BP. Значення в SP використовується, коли виконуються спеціальні інструкції запису (читання) стека PUSH та POP, а також при збереженні (поновленні) адреси точки повернення та прапорів процесора.
![]() |
![]() |
![]() |