Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
А С Е М Б Л Е Р.doc
Скачиваний:
7
Добавлен:
12.08.2019
Размер:
835.58 Кб
Скачать

Управління пам'яттю процесора

Пам'ять – це місце, де зберігаються програми, записані в машинному коді і дані, необхідні для роботи програм. В процесорах Intel x86 програми і дані знаходяться в одній і тій же пам'яті і для доступу до них існують дві шини – шина адреси (ША) і шина даних (ШД).

Представимо пам'ять як послідовність байтів, кожний з яких має свій порядковий номер –адрес. Для виконання яких-небудь операцій з певною ділянкою пам'яті, процесору необхідно вказати адресу першого байта цієї ділянки, подавши його на шину адреси. Після цього шина даних буде пов'язана з осередками, що знаходяться за вказаною адресою і через неї можна здійснювати необхідні операції.

Різні процесори мають різну розрядність ША і ШД. Розрядність ША визначає максимально можливу адресу в пам'яті, а розрядність ШД рівна кількості біт, які пересилаються між процесором і пам'яттю за раз.

В 8086 шина адреси складається з 20 ліній, а шина даних – з 16 ліній, тобто процесор може адресувати 220 байт (1 Мегабайт) пам'яті, при чому одночасно пересилається по 16 біт (2 байти).

Для того, щоб розв'язати проблему адресації 16-бітовим процесором пам'яті більшої, ніж 216 байт (64 Кілобайт), в 8086 використовується механізм сегментації. Фізична (20-бітовий) адреса логічно представляється двома 16-бітовими компонентами – сегментом і зсувом, які прийнято розділяти знаком «:».

Сегментна компоненту задає адресу початку блоку пам'яті (сегменту), розміром 64 Кілобайти, а зсув – кількість байт від початку сегменту до необхідної ділянки. Процесор використовує дуже просту схему визначення фізичної адреси:

Логічна адреса = сегмент: зсув. Фізична адреса = сегмент * 16 + зсув.

Звичайно ж, 16-бітовий зсув дозволяє одну і ту ж адресу задати різними парами сегмент: зсув. Наприклад, фізичну адресу 65 можна задати як 0:65, 1:49, 2:33, 3:17 і 4:, але у відладчику ми їх побачимо в 16-ричном коді.

В 80386 ША і ШД містять по 32 лінії. Але для сумісності з 8086, в реальному режимі адресувати можна тільки мегабайт пам'яті, хоча на шину даних вже можна передавати подвійні слова (32 біти).

Типи адресації 8086

Багато команд процесора можуть працювати з вмістом пам'яті, приймаючи як параметр логічну адресу потрібних для роботи даних. Наприклад, команда «MOV регістр, пам'ять» копіює дані з пам'яті в 8-і або 16-бітовий регістр загального призначення, а команда «MOV пам'ять, регістр» – з регістра в пам'ять.

Сегментна складова логічної адреси повинна знаходиться в одному з сегментних регістрів, а зсув задається як «ефективна адреса». Процесор 8086 підтримує 17 способів завдання ефективної адреси, які наочно можна представити у вигляді формули:

Ефективна адреса = вміст базового регістра (base) + вміст індексного регістра (index) + зсув (displacement), де базовий регістр – це BX або BP, а індексний – SI або DI. Будь-яка з компонент ефективної адреси може бути відсутній.

В асемблері існують такі способи запису ефективної адреси:

[BX + SI + 5] ; [базовий регістр + індексний регістр + константа]

5 [BX + SI] ; константа [базовий регістр + індексний регістр]

5 [BX][SI] ; константа [базовий регістр][індексний регістр]

[BX][SI][5] ; [базовий регістр][індексний регістр][константа]

В програмах часто використовується команда LEA (Load Effective Address), синтаксис якої аналогічний «MOV регістр, пам'ять». На відміну від MOV, LEA зберігає в регістрі не вміст пам'яті, а підрахована адреса.

Приклади запису команди MOV із завданням адреси:

MOV АХ, ds:[1234h] ; тільки константа

MOV CL, es:[di] ; тільки індексний регістр

MOV BX, cs:[bx - 2] ; базовий регістр і константа

MOV DH, ss:[BP][SI][10] ; базовий регістр, індексний регістр і константа

Якщо при вказівці адреси явно не задати сегмент, то використовуватиметься так званий «сегмент за умовчанням». У разі, коли узятий базовий регістр BP, сегмент за умовчанням – SS, у всіх інших – DS.

Спростимо попередній приклад:

MOV АХ [1234h] ; тільки константа

MOV CL, es:[di] ; тільки індексний регістр

MOV BX, cs:[bx - 2] ; базовий регістр і константа

MOV DH [BP][SI][10] ; базовий регістр, індексний регістр і константа

Будьте уважними, щоб уникнути таких помилок:

MOV АХ [dx] ; регістр не є ні базовим, ні індексним

MOV CH [si + di] ; два індексні регістри

MOV AL [cs:si] ; сегмент вказаний усередині квадратних дужок

Всі команди і типи адресації процесора 8086 підтримуються більш новими моделями, тому далі в тексті, якщо процесор явно не вказаний, матимемо на увазі, що використовується 8086.