
Лабораторна робота № 3
Тема: режими адресації та циклічна обробка знакових та беззнакових даних.
Ціль: вивчення адресації пам’яті та організації циклів.
Теоретичні відомості Непряма адресація пам’яті
При прямій адресації пам’яті в команді безпосередньо вказується адреса:
MOV AX, message ; в AX пересилається слово з пам’яті за адресою message
; те ж можна виконати, використовуючи непряму адресацію пам’яті
MOV BX, offset message
MOV AX, DS: [BX] ; в AX пересилається слово з пам’яті (сегменту даних), адреса якого записана в регістрі BX
Багато команд процесора можуть працювати з вмістом пам’яті, приймаючи в якості параметру логічну адресу даних, необхідних для роботи. Наприклад, команда “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 BX, offset message” еквівалентний запису “LEA BX, message”.
Приклади запису команди “MOV” з задаванням адреси:
MOV AX, DS: [1234h] ; лише константа
MOV CL, ES: [DI] ; лише індексний регістр
MOV BX, CS: [BX – 2] ; базовий регістр та константа
MOV DH, SS: [BP] [SI] [10] ; базовий, індексний регістри та константа
Якщо при вказуванні адреси явно не задати сегмент, то буде використовуватися так званий “сегмент по замовчуванню”. Для випадку, коли взятий базовий регістр BP, сегмент по замовчуванню – SS, в усіх інших випадках – DS.
DS |
SI DI BX |
SS |
BP |
Спростимо попередній приклад:
MOV AX, [1234h] ; лише константа
MOV CL, ES: [DI] ; лише індексний регістр
MOV BX, CS: [BX – 2] ; базовий регістр та константа
MOV DH, [BP] [SI] [10] ; базовий, індексний регістр та константа
Будьте уважними, щоб запобігти наступним помилкам:
MOV AX, [DX] ; регістр не є базовим чи індексним
MOV CH, [SI + DI] ; обидва регістри – індексні
MOV AL, [CS: SI] ; сегмент вказаний всередині квадратних дужок
Всі команди та типи адресацій процесора 8086 підтримуються новішими моделями, тому далі в тексті, якщо процесор явно не вказаний, буде вважатися, що мова йде про 8086.