Смекни!
smekni.com

Мова програмування Assembler (стр. 7 из 21)

1. Будова програми на мові Assembler

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

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

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

1. Будова програми на мові Assembler

ФОРМАТ КОДУВАННЯ

Основний формат кодування команд асемблера має наступний вигляд:

[мітка] команда [операнд(и)]

Мітка (якщо мається), команда й операнд (якщо мається) pозділяються принаймні одним пробілом або символом табуляції. Максимальна довжина рядка - 132 символи, однак, більшість бажають працювати з рядками в 80 символів (відповідно ширині екрана). Приклади кодування:

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

COUNT DB 1;Ім'я, команда, один операнд

MOV AX 0;Команда, два операнда

Мітки

Мітка в мові асемблера може містити наступні символи:

Букви: від A до Z і від a до z.

Цифри: від 0 до 9.

Спецсимволи: знак питання (?)крапка (.) (тільки перший символ)знак "комерційне эт" (@)підкреслення (-)долар ($).

Першим символом у мітці повинна бути буква спецсимвол. Асемблер не робить розходження між заголовними і рядковими буквами. Максимальна довжина - 31 символ. Приклади міток: COUNT, PAGE25, $E10. Рекомендується використовувати описові і значеневі мітки. Імена регістрів, наприклад, AX, DI чи AL є зарезервованими і використовуються тільки для вказівки відповідних регістрів. Наприклад, у команді ADD AX, BX асемблер "знає", що AX і BX відноситься до регістрів. Однак, у команді MOV REGSAVE,AX асемблер сприйме ім'я REGSAVE тільки в тому випадку, якщо воно буде визначено в сегменті даних. У додатку 3 приведений cписок усіх зарезервованих слів асемблера.

Команда

Мнемонічна команда вказує асемблеру яку дію повинен виконати даний оператор. У сегменті даних команда (чи директива) визначає поле, робочу oбласть чи константу. У сегменті коду команда визначає дію, наприклад, пересилання (MOV) чи додавання (ADD).

Операнд

Якщо команда назначає виконувану дію, то операнд визначає а) початкове значення даних або б) елементи, над якими виконується дія по команді. У наступному прикладі байт 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.