- •Регістри загального призначення процесора 8086
- •Р егістри спеціального призначення процесора 8086
- •Набір інструкцій процесора
- •Xchg ах, bx ; Міняємо місцями вміст ах і bx
- •Визначення даних
- •Виклик функцій bios і операційної системи
- •Директиви segment, assume, end і .386
- •Приклад визначення сегменту:
- •X db ? ; байт пам'яті, початкове значення якого не визначено
- •Управління пам'яттю процесора
- •Типи адресації 8086
- •Типи адресації 80386
- •Контроль над програмним потоком
- •Команди переходу після зіставлення чисел з урахуванням знака:
Управління пам'яттю процесора
Пам'ять – це місце, де зберігаються програми, записані в машинному коді і дані, необхідні для роботи програм. В процесорах 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.