Короткі теоретичні відомості
Лабораторна робота №7 Вивчення команд роботи з регістрами і пам’яттю МП х8086 Мета роботи: Вивчити основні способи адресації.
Короткі теоретичні відомості Способи адресації. Способом, або режимом адресації називають процедуру знаходження операнда для виконуваної команди. Якщо команда використовує два операнди, то для кожного з них повинен бути заданий спосіб адресації, причому режими адресації першого і другого операнда можуть, як збігатися, так і відрізнятися. Операнди команди можуть перебувати в різних місцях: безпосередньо у складі коду команди, в будь-якому регістрі, в комірці пам'яті; у останньому випадку існує кілька можливостей вказівки його адреси. Строго кажучи, способи адресації є елементом архітектури процесора, відображаючи закладені в ньому можливості пошуку операндів. З іншого боку, різні способи адресації певним чином позначаються в мові асемблера і є розділом мови. У програмах, написаних на мові асемблера термін "операнд" застосуємо до позначення тих фізичних об'єктів, з якими має справу процесор при виконанні машинної команди і, кажучи про операнди команд мови, розуміють насправді операнди машинних команд. По відношенню до команд асемблера використовується термін "параметри". В архітектурі сучасних 32-розрядних процесорів Intel передбачені досить витончені способи адресації; в МП 86 способів адресації менше. Ми в цій лабораторній роботі ознайомимося з режимами адресації, використовувані в МП 86. Розрізняють такі режими адресації: 1. регістровий; 2. безпосередній; 3. прямий; 4. регістровий непрямий (базовий або індексний); 5. регістровий непрямий зі зміщенням (базовий або індексний);
6. базово-індексний; 7. базовий індексний зі зміщенням.
1.1 Регістровий режим Значення операнда-джерела попередньо запам'ятовується в одному з вбудованих регістрів мікропроцесора. Сам регістр стає ефективним адресом. Операнд (байт або слово) знаходиться в регістрі. Цей спосіб застосовний до всіх програмно-адресуючих регістрів процесора:
1.2 Безпосередній режим Безпосередня адресація. Операнд (байт або слово) указується в команді і після трансляції поступає в код команди; він може мати любе значення (число, адреса, код ASCII), а також представлений у вигляді символічного позначення.
Команда mov, використана в останньому реченні, має два операнди; перший операнд визначається за допомогою реєстрової адресації, другий - за допомогою безпосередньої. Важливим застосуванням безпосередньої адресації є пересилання відносних адрес (зсувів), для цього використовується описувач offset (зсув):; Сегмент даних string db “Privet"; Рядок символів ; Сегмент команд mov DX,offset string; Адрес рядка пересилається в DX 1.3 Прямий режим. Адресується пам'ять; адрес комірки пам'яті (слова або байта) указується в команді (зазвичай в символічній формі) і поступає в код команди: ; Сегмент даних mem1 dw 0; Слово пам’яті містить 0 mem2 db 230; Байт пам’яті містить 230 ; Сегмент команд inc mem1; Вміст слова mem1 збільшується на 1 mov DX, mem1; Вміст слова з ім'ям mem1 завантажується в DX mov AL,mem2; Вміст байта з ім'ям mem2 завантажується в АL
Порівнюючи цей приклад з попереднім, ми бачимо, що вказівка в команді імені елементу пам'яті означає, що операндом є вміст цього осередку; вказівка імені осередку з описувачем offset - що операндом є адреса комірки.
Пряма адресація пам'яті на першій погляд, здається, простою і наглядною. Якщо ми хочемо звернутися, наприклад, до комірки mem1, ми просто вказуємо її ім'я в програмі. У дійсності, однак, справа йде складніше. Адреса будь-якої комірки складається з двох компонентів: сегментної адреси і зсуву. Позначення mem1 і mem2 в попередньому прикладі, є зсувами. Сегментні ж адреси зберігаються в сегментних регістрах. Однак сегментних регістрів чотири: DS, ES, CS і SS. Яким чином процесор дізнається, з якого регістра узяти сегментну адресу, і як повідомити йому про це в програмі? Процесор розрізняє групу кодів, що носять назву префіксів. Є декілька груп префіксів: повторення, розміру адреси, розміру операнда, заміни сегменту. Тут нас цікавитимуть префікси заміни сегменту. Команди процесора, звертаються до пам'яті, можуть в якості першого байта свого коду містити префікс заміни сегменту, за допомогою якого процесор визначає, з якого сегментного регістра узяти сегментну адресу. Для сегментного регістра ES код префікса становить 26h, для SS - 361i, для CS - 2Eh. Якщо префікс відсутній, сегментна адреса береться з регістра DS (хоча для нього теж передбачений свій префікс). У наведеному прикладі, за замовчуванням, всі дані адресуються через сегментний регістр DS, так що замість inc mem1 можна було написати inc DS: mem. У разі заміни сегментного регістра його обов'язково потрібно вказувати явно: inc ES: mem1 inc CS: mem2
Звернення до комірки пам'яті за відомою абсолютною адресою здійснюється наступним чином:
1.4 Регістровий непрямий (базовий і індексний). Адресується пам'ять (байт або слово). Відносна адреса елементу пам'яті знаходиться в регістрі, позначення якого полягає в прямі дужки. У МП 86 непряма адресація допустима тільки через регістри ВХ, ВР, SI і DI. При використанні регістрів ВХ або ВР адресацію називають базовою, при використанні регістрів SI або DI - індексною. Якщо непряма адресація здійснюється через один з регістрів ВХ, SI або DI, то мається на увазі сегмент, що адресується через DS, тому при адресації через цей регістр позначення DS: можна опустити:
mov es: [bx],'1' ――――→ mov [bx],'1'
До речі, цей фрагмент трохи ефективніше попереднього в сенсі витрачання пам'яті. Через відсутність в коді останньої команди префікса заміни сегмента він займає на 1 байт менше місця. Регістри ВХ, SI і DI в даному застосуванні зовсім рівнозначні, і з однаковим успіхом можна скористатися будь-яким з них: Не так стоїть справа з регістром ВР. Цей регістр спеціально призначений для роботи зі стеком, і при адресації через цей регістр в режимах непрямої адресації мається на увазі сегмент стека; іншими словами, в якості сегментного регістра за замовчуванням використовується регістр SS. Зазвичай непряма адресація до стека використовується в тих випадках, коли необхідно звернутися до даних, що містяться в стеку, без вилучення їх звідти (наприклад, якщо ці дані доводиться прочитувати неодноразово). Позначення цього способу адресації:
Використання базової адресації, на перший погляд, знижує ефективність програми, оскільки вимагає додаткової операції - завантаження в базовий регістр необхідної адреси. Однак команда з базовою адресацією займає менше місця в пам'яті (так як в неї не входить адреса комірки) і виконується швидше команди з прямою адресацією (через те, що команда коротше, процесору потрібно менше часу на її зчитування з пам'яті). Тому базова адресація ефективна в тих випадках, коли за заданою адресою доводиться звертатися багато разів, особливо, в циклі. Виграш виявляється тим більше, чим більше число, раз відбувається звернення за вказаною адресою. З іншого боку, можливості цього режиму адресації невеликі, і на практиці частіше використовують більш складні способи.
Приклади:
1.5 Регістровий непрямий режим із зсувом (базовий і індексний). Адресується пам'ять (байт або слово). Відносна адреса операнда визначається, як сума вмісту регістра BX, BP, SI або DI і вказаної в команді константи, іноді званої зсувом. Зсув може бути числом або адресою. Так само, як і у випадку базової адресації, при використанні регістрів BX, SI і DI мається на увазі сегмент, що адресується через DS, а при використанні ВР мається на увазі сегмент стека і, відповідно, регістр SS. зсув = {SP, BP, DI, SI, BX} + зсув з команди Іноді можна зустрітися з альтернативними позначеннями того ж способу адресації, які допускає асемблер. Замість, наприклад, 4 [ВХ] можна з таким же успіхом написати [ВХ +4], 4 + [ВХ] або [ВХ] +4. Така неоднозначність мови нічого, крім плутанини, не приносить, проте її треба мати на увазі, так як з цими позначеннями можна зіткнутися, наприклад, розглядаючи текст деассембльованої програми. Розглянемо тепер приклад використання базової адресації зі зміщенням при зверненні до стека: зсув = {SP, BP, DI, SI, BX} + зсув з команди
Тут квадратні дужки [] - це теж оператор. Він обчислює адресу як суму того, що знаходиться всередині дужок з тим, що знаходиться зовні. array db 0, 10, 20, 30, 40, 50, 60; Нехай в сегменті даних визначений масив: Послідовність команд: mov BX,5 mov AL,array [5]; завантажить в AL елемент масиву з індексом 5, тобто 50. Той же результат буде отриманий і в таких послідовностях команд: mov BX,offset array mov AL,5 [BX] або mov AL, [BX] +5 mov AL, [BX+5]
1.6 Базово-індексний режим Адресується пам'ять (байт або слово). Відносна адреса операнда визначається, як сума вмісту наступних пар регістрів:
У всіх цих випадках можна також писати:
Це надзвичайно поширений спосіб адресації, особливо, при роботі з масивами. У ньому використовуються два регістри, при цьому одним з них повинен бути базовий (ВХ або ВР), а іншим - індексний (SI або DI). Як правило, в одному з регістрів знаходиться адреса масиву, а в іншому - індекс в ньому, при цьому абсолютно байдуже, в якому що.
1.7 Базово-індексна адресація зі зміщенням. Адресується пам'ять (байт або слово). Відносна адреса операнда визначається як сума вмісту двох регістрів і зсуву. Це спосіб адресації є розвитком попереднього. У ньому використовуються ті ж пари регістрів, але отриманий з їх допомогою результуючий адресу можна ще змістити на значення вказаної в команді константи. Як і у випадку базово-індексної адресації, константа може представлятись індексом (і тоді в одному з регістрів повинна міститися базова адреса пам'яті), але може бути і базовою адресою. В останньому випадку регістри можуть використовуватися для зберігання складових індексу.
Наведемо формальний приклад даного режиму адресації. Нехай в сегменті даних визначений масив з 24 байт syms db 'ЙЦУКЕНГШЩЗХЪ' db 'йцукенгшщзхъ' послідовність команд mov BX,12mov SI,6 mov DL,syms [BX] [SI]; завантажить в регістр DL елемент з індексом 6 з другого ряду, тобто код ASCII букви г Той же результат буде отриманий і в такому варіанті: mov BX,offset syms mov SI,6 mov DL,12 [BX] [SI]
Читайте также: Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|