ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


Режими адресації з базуванням

 

Режими адресації, при яких для обчислення адреси використовуються базові регістри BX і BP, називаються режимами адресації з базуванням (або базовою адресацією). Використання регістрів BX і BP як базових означає, що вони використовуються для ідентифікації початку деякої області пам'яті. Якщо в команді використовується регістр BX, то при її виконанні буде здійснюватися доступ до інформаційного сегмента, а якщо BP – то до стекового сегмента.

Адресація з базуванням може бути непрямою і прямою.

При непрямій адресації з базуванням у базовому регістрі зберігається постійна адреса (базова адреса) деякої області пам'яті і доступ до окремих комірок цієї області здійснюється шляхом модифікації вмісту базового регістра.

Нехай, наприклад, у програмі для обчислення виразу

Z=X+H-D,

де X=15, H=27, D=12

операнди X, H, D описані в такий спосіб:

MAS DW 15, 27, 12

Тоді фрагмент програми для обчислення зазначеного виразу Z може бути таким:

LEA BX, MAS ; Завантаження базового регістра

MOV AX, [BX] ; Обчислення виразу

ADD AX, [BX+2] ;

SUB AX, [BX+4] ;

Відстань від бази (зміщення) у даному випадку кратна двом, оскільки кожен з операндів X, H і D займає в пам'яті слово.

Синтаксис Асемблера дозволяє використовувати режим адресації з базуванням трьома різними способами. Такі команди еквівалентні:

ADD AX, [BX+2]

ADD AX, [BX]+2

ADD AX, 2[BX]

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

 

MOV AX, MAS [BX]

ADD AX, MAS [BX+2]

SUB AX, MAS [BX+4]

 

Режими адресації з індексацією

 

Режими адресації, при яких для обчислення адреси використовуються індексні регістри SI і DI, називаються режимами адресації з індексацією (або індексною адресацією).

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

Індексна адресація, як і базова, може бути непрямою і прямою.

При непрямій індексній адресації виконавча адреса задається безпосередньо в індексному регістрі, наприклад:

MOV AL, [SI]

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

INC TABLE [SI]

зміщення, задане змінною TABLE, є адресою деякої області пам'яті. Ця адреса складається з вмістом регістра SI для отримання виконавчої адреси.

 

Режими адресації з базуванням та індексацією

 

Адресація з базуванням і індексацією представляє собою сполучення базової й індексної адресації і може бути як непрямою так і прямою.

При непрямій адресації з базуванням і індексацією виконавча адреса дорівнює сумі вмісту базового й індексного регістрів. Команди з непрямою базовою індексною адресацією мають вигляд:

SUB AX, [BX] [SI]

або SUB AX, [BX+SI]

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

MOV AL, TBL [BX] [SI]

ADD AX, TBL [SI+BX]

Зміщення у команді може задаватися також числовою константою, причому дозволяється кілька форматів операндів, адресованих за базою з індексацією:

MOV AX, [BX+DI+2]

MOV AX, [DI+2+BX]

MOV AX, [BX+2] [DI]

MOV AX, [BX] [DI+2]

Базова індексна адресація є найскладнішим й одночасно найгнучкішим режимом адресації.

 

Команди керування циклами

 

Для організації програмних циклів в Асемблері застосовуються три команди керування циклами. В них передбачено використання регістра СХ як лічильника циклу. Основна команда керування циклами

LOOP мітка

зменшує вміст регістра CX на 1 і передає керування на “мітку”, якщо вміст регістра CX не дорівнює 0. Наприклад, для сторазового виконання певної групи команд можна скористатися таким програмним фрагментом:

MOV CX, 100

BEGIN: . . . .

. . . .

LOOP BEGIN

Команда LOOP BEGIN еквівалентна двом командам:

DEС CX

JNZ BEGIN

Команда LOOP завершує виконання циклу тільки в тому випадку, якщо вміст регістра CX зменшено до 0. Однак у багатьох програмах використовуються такі цикли, які повинні завершуватися при виконанні певних умов до того, як вміст регістра CX досягає нуля. Таке альтернативне завершення циклу забезпечується командами LOOPE і LOOPNE.

Команда LOOPE, що має синонім LOOPZ, зменшує вміст регістра CX на 1, а потім здійснює перехід, якщо вміст регістра CX не дорівнює 0 і прапорець нуля ZF дорівнює 1. Таким чином, повторення циклу завершується, якщо вміст регістра CX дорівнює 0 чи прапорець ZF дорівнює 0, або обидва вони рівні 0.

Команда LOOPNE, що має синонім LOOPNZ, зменшує вміст регістра CX на 1, потім здійснює перехід, якщо вміст регістра CX не дорівнює 0 і прапорець нуля ZF дорівнює 0. Таким чином, повторення циклу завершується, якщо вміст регістра CX дорівнює 0 чи прапорець ZF дорівнює 1, або коли виконані і перша, і друга умови.

Необхідно також відзначити, що мітка в командах керування повинна знаходиться не далі –128 чи +128 байт від адреси команди.

 

Режими адресації в командах безумовних і умовних переходів

Раніше були розглянуті команди безумовних і умовних переходів за прямою і непрямою адресою з використанням регістрів.

В загальному випадку, у командах переходів можуть використовуватися різні режими адресації, в тому числі з базуванням, з індексацією, з базуванням і індексацією.

Приклади команд переходів:

JMP TBL [BX]

JG TBL [SI]

JNE TBL [BX] [SI]

JMP [BX]

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

 

Команда зміни знаку

 

Для зміни знаку числа або утворення доповняльного коду використовується команда NEG. При виконанні команди прапорці змінюються таким чином:

- прапорець переносу CF і прапорець знаку SF дорівнюють 1, якщо операнд є ненульове позитивне число; у противному разі вони дорівнюють 0;

- прапорець парності PF дорівнює 1, якщо результат має парне число бітів, рівних 1; у противному разі він дорівнює 0;

- прапорець нуля ZF дорівнює 1, якщо операнд дорівнює 0; у протилежному випадку він дорівнює 0;

- прапорець переповнення OF дорівнює 1, якщо операнд-байт має значення 80Н або операнд-слово має значення 8000Н; у противному разі він дорівнює 0.

Команда NEG корисна для віднімання значення регістра або комірки пам'яті від безпосереднього значення. Оскільки безпосереднє значення не може бути приймачем, тому, для віднімання від нього, наприклад, значення регістра AX, можна спочатку змінити знак вмісту цього регістра, а потім додати до нього безпосереднє значення:

NEG АX

ADD AX, 25

 

Робота з масивами

 

Розглянемо особливості програм на Асемблері для роботи з масивами.

Для доступу до елементів одновимірного масиву найбільш доцільно використовувати індексну адресацію. У регістр SI чи DI можна помістити адресу початку масиву, а для вказівки наступного елемента масиву модифікувати вміст індексного регістра в залежності від значення типу (числа байт) пам'яті, зайнятих елементами масиву.

Нехай, наприклад, масив MAS заданий таким чином:

MAS DB 3, -5, 16, 7, -12

Процедура для обчислення суми елементів масиву MAS буде мати вигляд:

MAIN PROС

SUB AL, AL ; Обнулення акумулятора

MOV CX, N ; Встановити лічильник байтів

LEA SI, MAS ; Занести початкову адресу

M1: ADD AL, [SI] ; Підсумовувати

INC SI ; Збільшити покажчик

LOOP M1 ; Перевірка кінця циклу

RET

MAIN ENDP

Другий варіант процедури для обчислення суми елементів масиву MAS з використанням прямої індексної адресації:

 

MAIN PROС

SUB AL, AL

MOV CX, N

SUB SI, SI ; Обнулення регістра SI

M1: ADD AL, MAS [SI]

INC SI

LOOP M1

RET

MAIN ENDP

Для роботи з двовимірними масивами можна використовувати базову індексну адресацію.

Нехай, наприклад, необхідно обчислити добуток елементів I-ого рядка матриці, що складається з M рядків і N стовпців.

Оскільки в пам'яті елементи матриці розташовані підряд по рядках, доступ до першого елемента I-ого рядка можна визначити за формулою:

Ai = AMAS + (I-1)*N*L

де Ai – адреса першого елемента I-ого рядка;

AMAS – початкова адреса матриці;

L – число байтів, що займає один елемент матриці.

Нехай сегмент даних має вигляд:

 

DATA SEGMENT

MAS DW 3, -5, 6, 7, -1, 2

DW 12, 8, -25, 4, 0, 1

DW 3, 2, 15, -3, 1, 2

DW -4, 6, 5, 12, 5, 8

M DW 4

N DW 6

I DW 2

L DW 2

DATA ENDP

 

Тоді процедура для обчислення добутку елементів I-ого рядка зазначеної матриці буде мати вигляд:

MAIN PROС

MOV BX, 0 ; Обнулити регістр BX

MOV SI, 0 ; Обнулити регістр SI

MOV CX, N ; Встановити лічильник CX

MOV AX, I ; Обчислення адреси AI

DEC AX ;першого елемента I-ого рядка

MUL N

MUL L

ADD BX, AX ; Занести адресу AI в BX

MOV AX, 1

M1: IMUL MAS [BX] [SI] ; Помножити

INC SI ; Збільшити покажчик на 2 байти

INC SI

LOOP M1 ; Перевірити кінець циклу

RET

MAIN ENDP

 

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти