
- •Основи програмування на мові асемблер та знайомство з програмним забезпеченням для виконання лабораторних робіт
- •Теоретичні відомості
- •1.1 Особливості архітектури мікропроцесора типу Intel 80х86
- •Головні регістри мп Intel 8086 та їх призначення
- •1.2 Організація обчислень та узагальнена архітектура комп’ютера ibm pc
- •1.3 Основи програмування на мові асемблер та її синтаксис. Позначки, коди команд, операнди та директиви
- •1.4. Перетворення програми з тексту на мові асемблера у виконуваний модуль
- •1.5. Основи роботи з програмою afd
- •1.6. Основи роботи з програмою td
- •2. Порядок виконання роботи
- •4. Контрольні питання:
- •Сегментація програми. Сегменти коду, даних та стеку. Їх розташування в пам’яті еом. Директиви мови асемблера segment та ends.
- •Арифметичні та логічні операції мови асемблер
- •1. Теоретичні відомості
- •Директиви визначення даних
- •1.2. Команда перенесення даних
- •1.3. Арифметичні операції над двійковими числами
- •1.4. Команди логічних операцій
- •1.5. Команди зсуву бітів числа
- •1.6. Команди циклічного зсуву бітів числа
- •1.7. Структура асемблерних програм для com- та exe-модулів. Виклик процедур та стек
- •Таким чином, структура com-програми повинна бути такою:
- •2. Варіанти індивідуальні завдання для лабораторної роботи
- •3. Порядок виконання роботи
- •5. Контрольні питання
- •Структура програми на мові асемблер. Команди вітвлення та циклу
- •1. Теоретичні відомості
- •1.1 Механізми передачі керування та зміна послідовності виконання команд. Їх реалізація у мові асемблера. Типи адресації
- •1.2 Команда безумовного переходу jmp
- •1.3 Команда циклу loop
- •1.4 Команда порівняння cmp
- •1.5. Команди умовного переходу в мові асемблер
- •2. Варіанти індивідуальних завдань
- •3. Порядок виконання роботи
- •Виведення даних на монітор персонального комп’ютера
- •1. Теоретичні відомості
- •1.1. Представлення арифметичних та рядкових даних. Формати ascii та bcd. Команди корекції
- •1.2. Команди обробки рядкових даних мови асемблера
- •1.3. Переведення ascii-формату у двійковий формат та навпаки
- •Починаючи з молодшого байту обробляти число у лівому напрямку.
- •Вилучати трійки з шістнадцятирічних цифр кожного ascii-байту.
- •Множити отримані цифри на ваговий коефіцієнт кожного з розрядів та складати результати.
- •1.4. Введення та виведення даних в мові асемблера
- •1.5. Реалізація екранних операцій у мові програмування асемблер
- •2. Індивідуальні завдання для виконання лабораторної роботи №4
- •3. Порядок виконання роботи
- •5. Контрольні питання
- •Перелік рекомендованої літератури
- •Додаток 1 загальні вимоги до оформлення протоколів лабораторних робіт
- •Додаток 2 головні функції перериваннь bios та операційної системи ms-dos д2.1 переривання bios
- •Int 05h. Друк екрану.
- •Int 10h. Керування монітором (більш досконало функції переривання 10н описані у теоретичних відомостях до лабораторної роботи №4).
- •Int 11h. Запит списку приєднаного обладнання.
- •Д2.2 переривання ms-dos
- •Д2.3 головні функції перивання ms-dos int 21н
- •Додаток 3
1.3 Основи програмування на мові асемблер та її синтаксис. Позначки, коди команд, операнди та директиви
Формат запису команди асемблеру має такий вигляд [4,7-9]:
{позначка:} [асемблерний код команди] {операнди}; {коментарії}
Усі позначки у програмі повинні бути унікальними, і при цьому треба пам’ятати, що асемблер не відрізняє прописні та маленькі літери. При максимальній довжині рядка програми 132 символи (більшість програмістів використовують з них лише 80 відповідно до довжини екрану) максимальна довжина позначки - 31 символ. Позначка (якщо існує), асемблерний код команди та операнд відокремлюються один від одного принаймні одним проміжком або символом табуляції. Коментарі можуть стояти в любому місці асемблерної програми та повинні починатися з символу ; (крапка з комою). Всі символи в рядку асемблерної програми, що стоять праворуч від крапки з комою, вважаються за коментарі. Коментарі можуть містити будь-які друковані символи української або латинської абетки, цифрові та спеціальні символи, включаючи проміжок. Коментар може займати весь рядок або стояти праворуч від асемблерної команди, наприклад:
; Програма виводу даних на друк
ADD AX, BX; Додати два числа, що містяться в регістрах АX та BX
Зрозуміло, що кількість коментарів ніяк не впливає на складність програми, оскільки вони не відносяться до машинних кодів.
Позначки в асемблері можуть містити такі символи:
1. Англійські літери |
A...Z, a...z |
2. Цифри |
0...9 (не можуть бути першим символом позначки). |
3.Спеціальні символи |
Знак питання (?); амперсанд(@); підкреслення ( _ ); долар ($); крапка (.) (тільки як перший символ позначки). |
Також заборонено використовувати як позначки зарезервовані асемблером слова, до яких відносяться коди команд, директиви, імена регістрів тощо. У таблиці 3 наведені приклади вірних та невірних позначок.
Таблиця 3. Приклади позначок
-
Приклади вірних позначок
Приклади невірних позначок
CoU
AX
$10
1A
Thislabelisverylongbutcorrect
It_is_a_label
_y_z
@2
.2
M2
Thislabelisverylongandnotcorrect
Це є позначка
It is a label
ADD
Proc
2
2M
!2
2.
Асемблерний код команди вказує транслятору, яку дію треба виконати у даній операції. Це може бути пересилання даних між регістарми процесору, з регістру до пам’яті або навпаки (команда MOV), команди обробки даних, наприклад збільшення чи зменшення на 1 (INC, DEC), додавання (АDD), віднімання (SUB), множення (MUL) або ділення (DIV), команди організації логіки програми, команди переходу на підпрограму та багато інших.
Якщо передбачена робота з даними і кодом команди вони не визначаються, то асемблерна команда завжди містить операнд, який може містити:
Чисельне значення даних;
Регістри та комірки пам’яті, над якими буде виконуватись дія, що обумовлюється кодом команди
Приклади асемблерних команд:
CNT DB 10; Визначити байт пам’яті з назвою CNT та занести до нього число 10.
MOV AL,CNT; Занести до регістру АL число з комірки CNT
ADD AL,12; Збільшити число, що міститься у регістрі AL на 12.
INC AL; Збільшити число у регістрі, що міститься у регістрі AL на 1.
MOV BL,AL; Переслати дані з регістру AL до регістру BL.
. RET; Команда повернення з підпрограми. Операндів не має.
Крім того, асемблер має велику кількість операторів, які дозволяють керувати процесом асемблювання та виведенням початкового тексту програми на друк. Ці оператори називаються псевдокомандами або директивами [4,7-9]. Вони використовуються тільки при асемблюванні програми та не генерують асемблерного коду. Головні з них наведені нижче.
Директива PAGE. Ця директива розміщується на початку програми та вказує на кількість рядків, що друкуються на сторінці, та кількість символів в одному рядку. Формат директиви:
PAGE [кількість рядків], [кількість символів]
Наприклад, директива
PAGE 50,100
встановлює режим виведення даних на друк 50 рядків на лист при сотні символів в одному рядку. Кількість рядків може бути встановлена у межах 10-255, кількість символів від 60 до 132.
Директиви SEGMENT та ENDS. Як вам вже відомо, будь-яка асемблерна програма має принаймні один сегмент - сегмент коду програми. В більшості програм окремими сегментами виділяються чисельні дані користувача та стек. Сегмент описується за допомогою директиви SEGMENT таким чином:
NSEG SEGMENT {параметри}
. . .
. . . ; інструкції асемблера
. . .
NSEG ENDS
Ім’я сегменту є обов’язковим, мусить бути унікальним та відповідати узгодженням про імена позначок, які наводилися вище. Директива ENDS з тією ж позначкою відповідає кінцю сегмента.
Директива ORG. Ця директива використовується для зміни вмісту лічильника адреси без допомоги асемблерних команд умовного чи безумовного переходу. Найчастіше вживається для встановлення адреси завантаження програми на її початку. Наприклад, директива
ORG 100H
встановлює лічильник адреси на зміщення 100H (шістнадцятирічне число 100) відносно початку сегменту кода, а директива
ORG $+10H
збільшує адресу, яка завантажена у лічильник команд, на 10H (шістнадцятирічне число 10).
Директиви PROC та ENDP, команди CALL та RET. Сегмент коду може крім кодів основної програми містити одну чи декілька процедур, які визначаються директивою PROC. В кінці процедури повинні стояти команда RET та директива ENDP. Директива ENDP ставиться для того, щоб транслятор асемблера розпізнав початок та кінець процедури та її обсяг. Виклик процедури здійснюється за допомогою команди CALL. Формат команди:
CALL [ім’я процедури]
При виклику процедури числа, що знаходяться у всіх регістрах процесора, завантажуються до стека, а до лічильника команд завантажується адреса початку процедури. На кінці процедури перед директивою ENDP ставиться команда RET. Результатом її виконання є завантаження вмісту верхніх комірок стеку до регістрів процесора та перехід на точку переривання головної програми. Команда RET може ставитися і в середині процедури, якщо це передбачено логікою програми. Крім того, цією командою здійснюється вихід з асемблерної програми до командного режиму MS-DOS. Таким чином, асемблерна програма, яка містить процедуру, буде мати такий вигляд:
NSEG SEGMENT; опис сегменту
NPROC PROC; опис процедури
. . .
. . .
. . .
RET; повернення до основної програми
ENDP; кінець процедури
. . .
. . .
. . .
CALL NPROC;
. . .
. . .
RET; повернення до MS-DOS
ENDS;
Директива END. Ставиться останнею у програмі та завершує її. Якщо програма писалася як процедура, директива END містить ім’я процедури як параметр (END {[ім’я процедури]}). Якщо це com-програма і виконується в одному сегменті, параметр не використовується.