Операнд

Якщо команда назначає виконувану дію, то операнд визначає а) початкове значення даних або б) елементи, над якими виконується дія по команді. У наступному прикладі байт COUNTER визначений у сегменті даних і має нульове значення:

 

Мітка Команда Операнд

COUNTER DB 0;

Визначити байт (DB); з нульовим значенням.

 

Команда може мати один чи два операнда, або взагалі бути без операндів. Розглянемо наступні три приклади:

 

Команда Операнд Коментар

Немає операндів RET; Повернутися

Один операнд INC CX ;Збільшити CX

Два операнда ADD AX,12 ;Додати 12 до AX

 

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

 

2. Поняття "сегмент", "регістр", "підпрограмма"

Сегментом називається область, що починається на границі параграфа, тобто по будь-якій адресі, що поділяється на 16 без залишку. Хоча сегмент може розташовуватися в будь-якому місці пам'яті і мати розмір до 64 Кбайт, він вимагає стільки пам'яті, cкільки необхідно для виконання програми. Існує три головних сегменти:

1. Сегмент кодів. Сегмент кодів містить машинні команди, які будуть виконуватися. Звичайно перша виконувана команда знаходиться на початку цього сегмента і операційна система передає керування за адресою даного сегмента для виконання програми. Регістр сегмента кодів (CS) адресує даний сегмент.

2. Сегмент даних. Сегмент даних містить визначені дані, константи і робочі області, необхідні програмі. Регістр сегмента даних (DS) адресує даний сегмент.

3. Сегмент стека. Стік містить адреси повернення як для програми для повернення в операційну систему, так і для викликів підпрограм для повернення в головну програму.

Регістр сегмента стека (SS) адресує даний сегмент.

Ще один сегментний регістр - регістр додаткового сегмента (ES), призначений для спеціального використання. На pис.1.2 графічно представ- лені регістри SS, DS і CS.

Послідовність регістрів і сегментів на практиці може бути інша. Три сегментних регістри містять початкові адреси відповідних сегментів і кожен сегмент починається на границі параграфа. Усередині програми всі адреси пам'яті відносні до початку cегмента. Такі адреси називаються зсувом від початку сегмента. Двобайтовий зсув (16-бітний) може бути в межах від значення 0000 до значення FFFF або від 0 до 65535. Для звертання до будь-якої адреси в програмі, комп'ютер складаєадреса в регістрі сегмента і зсуву. Наприклад, перший байт у сегменті кодів має зсув 0, другий байт - 01 і так далі до зсуву 65535. Як приклад адресації, допустимо, що регістр сегмента даних містить значення 045F і деяка команда звертається до комірки пам'яті усередині сегмента даних з зсувом 0032. Недивлячись на те, що регістр сегмента даних містить 045F, він вказує на адресу 045F0, тобто на границі параграфа. Дійсний aдрес пам'яті тому буде наступний:

Адреса в DS: 045F0

Зсув: 0032

Реальна адреса: 04622

Яким чином процесори 8086/8088 адресують пам'ять в один мільйон байт? У регістрі міститься 16 біт. Оскільки адреса сегмента завжди на границі параграфа, молодші чотири біти адреси pівні нулю. Тичина. FFF0 дозволяє адресувати до 65520 (плюс зсув) байт. Але фахівці вирішили, що нема рації мати місце для бітів, що завжди дорівнюють нулю. Тому адреса зберігаються в cегментному регістрі як шіст. nnnn, а комп'ютер думає, що існує ще чотири нульових молодших біта (одна шіст. цифра), тобто шіст. nnnn0. Таким чином, тичина. FFFF0 дозволяє адресувати до 1048560 байт. Якщо ви сумніваєтесь, то декодуйте кожне тичина. F як двійкове 1111, врахуйте нульові біти і складете значення для одиничних біт. Процесор 80286 використовує 24 біта для адресації так, що FFFFF0 дозволяє адресувати до 16 мільйонів байт, а процесор 80386 може адресувати до чотирьох мільярдів байт.


3. Граматичні конструкції, які відповідають цим поняттям

 

РЕГІСТРИ

Процесори 8086/8088 мають 14 регістрів, використовуваних для yправления програмою, що виконується, для адресації пам'яті і для забезпечення арифметичних обчислень. Кожен регістр має довжину в одне слово (16 біт) і адресується по імені. Біти регістра прийняті нумерувати ліворуч праворуч:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Процесори 80286 і 80386 мають ряд додаткових регістрів, деякі з них 16-бітові. Ці регістри тут не розглядаються. Сегментні регістри CS, DS, SS і ES.

Кожен сегментний регістр забезпечує адресацію 64ДО пам'яті, що називається поточним сегментом. Як показано раніше, cегмент вирівняний на границю параграфа і його адреса в сегментному pегістрі припускає наявність праворуч чотирьох нульових бітів.

1. Регістр CS.

Регістр сегмента коду містить початковий адреса сегмента коду. Ця адреса плюс величина зсуву в командному покажчику (IP) визначає адреса команди, яка повинна бути обрана для виконання. Для звичайних програм немає необхідності робити посилання на регістр CS.

2. Регістр DS.

Регістр сегмента даних містить початковий адрес сегмента даних. Ця адреса плюс величина зсуву, визначена в команді, вказують на конкретний осередок у сегменті даних.

3. Регістр SS.

Регістр сегмента стека містить початковий адрес в сегменті стека.

4. Регістр ES. Деякі операції над рядками використовують додатковий сегментний регістр для керування адреси цієї пам'яті. У даному контексті регістр ES зв'язаний з індексним регістром DI. Якщо необхідно використовувати регістр ES, асемблерна програма повинна його інніціалізувати.

Регістри загального призначення: AX, BX, CX і DX

При програмуванні на асемблере регістри загального призначення є "робочими конячками". Особливість цих регістрів полягає в тому, що можлива адресація їх як одного цілого чи слова як oднобайтової частини. Лівий байт є старшою частиною (high), a правий - молодшою частиною (low). Наприклад, двобайтовий регістр CX складається з двох однобайтових: CH і CL, і посилання на регістр можливі по кожному з цих трьох імен. Наступні три асемблерні команди засилають нулі в регістри CX, CH і CL, відповідно:

 

MOV CX,00

MOV CH,00

MOV CL,00

 

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

 

AX: ¦ AH ¦ AL ¦

 

2. Регістр BX. Регістр BX є базовим регістром. Це єдиний регістр загального призначення, що може використовуватися в якості "індексу" для розширеної адресаціі. Інше загальне застосування його - обчислення.

 

BX: ¦ BH ¦ BL ¦

 

3. Регістр CX. Регістр CX є лічильником. Він необхідний для керування числом повторень циклів і для операцій зрушення уліво або вправо. Регістр CX використовується також для обчислень.

 

CX: ¦ CH ¦ CL ¦

 

4. Регістр DX. Регістр DX є регістром даних. Він застосовується для деяких операцій уведення/висновку і тих операцій множення і розподілу над великими числами, які використовують реєстрову пару DX і AX.

 

DX: ¦ DH ¦ DL ¦

 

Будь-які регістри загального призначення можуть використовуватися для додаваня і вирахування як 8-ми, так і 16-ти бітових значень.

Реєстрові покажчики: SP і BP

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

1. Регістр SP. Покажчик стека забезпечує використання стека в пам'яті, дозволяє тимчасово зберігати адреса і інколи дані. Цей регістр зв'язаний з регістром SS для адреси цього стека.

2. Регістр BP. Покажчик бази полегшує доступ до параметрів: даним і адресам переданим через стек.

Індексні регістри: SI і DI

Обоє індексні регістри можливі для розширеної адресаціїі для використа- ння в операціях додавання і вирахування.

1. Регістр SI. Цей регістр є індексом джерела і застосовується для деяких операцій над рядками. У даному контексті регістр SI зв'язаний з регістром DS.

2. Регістр DI. Цей регістр є індексом призначення і застосовується також для строкових операцій. У даному контексті регістр DI зв'язаний з регістром ES.

Регістр командного покажчика: IP

Регістр IP містить зсув на команду, що повинна бути виконана. Звичайно цей регістр у програмі не використовується, але він може змінювати своє значення при використанні відлагоджувача DOS DEBUG для тестування програми.

Флаговий регістр

Дев'ять з 16 бітів флагового регістра є активними і визначають поточний стан машини і результати виконання. Багато арифметичних команд і команди порівняння змінюють стан прапорів. Призначення флагових бітів:

Прапор Призначення

O (Переповнення) Вказує на переповнення старшого біта при арифметичних командах.

D (Напрямок) Позначає ліве чи праве направлення чи пересилання порівняння строкових даних (даних у пам'яті перевищуючих довжину одного слова).

I (Переривання) - Вказує на можливість зовнішніх переривань.

T (Покроковий режим) - Забезпечує можливість роботи процесора в покроковому режимі.

Наприклад, програма DOS DEBUG впливає на даний прапор так, що ймовірне покрокове виконання кожної команди для перевірки зміни вмісту регістрів і пам'яті.

S (Знак) Містить результуючий знак після арифметичних операцій (0 - плюс, 1 - мінус).

Z (Нуль) Показує результат арифметичних операцій і операцій порівняння (0 - ненульовий, 1 - нульовий результат).

A (Зовнішній перенос) Містить перенос з 3-го біта для 8-бітних даних, використовується для спеціальних арифметичних операцій.

P (Контроль парності) Показує парність молодших 8-бітних даних (1 - парне і 0 - непарне число).

C (Перенос) Містить перенос зі старшого біта, після арифметичних операцій, а також останній біт при зрушеннях або циклічних зрушеннях.

Під час програмування на асемблері, частіше всього використовуються прапори O, S, Z, і C для арифметичних операцій і операцій порівняння, а прапор D для позначення напрямку в операціях над рядками. У наступних розділах міститься більш докладна інформація про флаговий pегістр.

 

4. Тип даних в асемблері. Поняття "байт", "півбайт", "слово", та інші