
- •Тема Основи програмування на мові асемблер та знайомство з програмним забезпеченням (відладчиками)
- •Теоретичні відомості
- •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.
Л а б о р а т о р н а р о б о т а №7
Тема Основи програмування на мові асемблер та знайомство з програмним забезпеченням (відладчиками)
Мета роботи: Знайомство з структурою персонального комп’ютера та основами програмування на мові асемблера. Студенту треба навчитися працювати з програмою-транслятором Turbo-Assembler (TASM) та з засобами для відлагодження асемблерних програм AFD та TD.
Необхідні знання та практичні навички: Знання структури мікропроцесорів сімейства Intel 80х86 [2,4,5,12] та основ програмування на мові асемблер [1,4]. Вміння працювати з інтерфейсом типу Turbo-Vision [7-9]. Студентам обов’язково треба відновити свої знання з таких розділів:
“Поняття про системи числення.”
“Арифметичні дії над числами при їх представлені у двійковій, вісімковій та шістнадцятирічній системах.”
“Переведення чисел з однієї системи числення до іншої.”
Теоретичні відомості
1.1 Особливості архітектури мікропроцесора типу Intel 80х86
Найважливішою особливістю комп'ютерних систем на основі мікропроцесорів (МП) типу Intel 8086 є сегментна організація пам'яті. Сегментом називається область пам'яті, що починається з адреси, кратної 16, і містить дані однієї структури. Загалом це можуть бути:
інструкція для МП, або коди команд;
дані користувача;
адреси повернення з підпрограм.
Таким чином, відрізняють три головних сегмента програми, яким відповідають сегментні регістри процесора типу INTEL 8086:
CS (code segment, тобто сегмент інструкцій програми);
DS (data segment, тобто сегмент даних, які визначені користувачем);
SS (stack segment, тобто сегмент стеку).
Як вам відомо [1], стеком називається область пам'яті ЕОМ, яка відрізняється організацією доступу до даних, які поступають до стека за принципом «останній ввійшов – перший вийшов». Більш досконало про стекову організацію пам'яті та про програмування стека на апаратному рівні ви дізнаєтесь з теоретичних відомостей до лабораторної роботи №2.
У мікропроцесорі Intel 8086 існує також розширений сегмент ES (extend segment), який ефективно використовується при роботі з рядковими даними. Більш досконало про можливості використання цього сегменту при програмуванні ви дізнаєтесь з відповідного розділу теоретичних відомостей до лабораторної роботи №4.
В програмі, яку обробляє ЕОМ, всі адреси прив'язанні до початку сегмента. Таким чином, адреса осередку пам'яті, до якого звертається процесор, немов би складається з двох частин: старші розряди – адреса сегменту, молодші – адреса зміщення.
Головні регістри мп Intel 8086 та їх призначення
Сегментні регістри CS, DS, SS, ES.
Регістри-вказівники (РВ)
IP (interrupt point) – адреса, за якою на даний час припинено виконання програми, або лічильник команд. Таким чином, повна адреса, за якою розташований код команди, що виконується, може бути записана таким чином: CS:IP.
DI (data interrupt) – відносна адреса, за якою розташована змінна користувача, що використовується програмою на даний час. Таким чином, повна адреса, за якою розташовані дані користувача, може бути записана таким чином: DS:DI. Слід відзначити, що регістр DI використовується також в парі з сегментним регістром ES.
SP (stack pointer)– вказівник стека. Вказує на відносну адресу останньої змінної, що була завантажена до стека. При виконанні команди «вивантажити змінну зі стека» буде вивантажена саме ця змінна.
SI та DI – індексні регістри. Обидва цих регістра можуть бути використані для розширеної адресації та для реалізації арифметичних операцій складання та віднімання. Але головне їх призначення – робота з рядковими даними. При цьому індексний регістр DI пов'язаний з сегментним регістром DS, а індексний регістр SI - з сегментним регістром ES. Більш досконало про операції обробки рядкових даних у мові асемблера можна прочитати в описі лабораторної роботи №4.
Регістри загального призначення (РЗП) та їхні функції
Акумулятор (АХ)
Акумулятор є головним з регістрів загального призначення. Навіть ті команди процесора, які можуть бути виконані за допомогою інших регістрів, при використанні акумулятора виконуються значно швидше. Цей регістр безпосередньо зв'язаний з арифметико-логічним пристроєм (АЛП) мікропроцесора, який реалізує виконання команд програми на апаратному рівні. Як і всі регістри процесора Intel 8086, акумулятор має 16 розрядів і звертатись до нього на програмному рівні можна через абревіатуру АХ. Можна також заносити числа лише до восьми молодших розрядів акумулятора, звертаючись до них через абревіатуру AL, або до восьми старших, звертаючись до них через абревіатуру АН. Таке ж саме правило діє при звертанні до інших регістрів загального призначення, які будуть розглядатися далі.
Головні функції, які виконуються за допомогою акумулятора у мікропроцесорній системі:
всі арифметичні операції;
всі логічні операції;
всі операції введення/виведення даних;
операції над рядками.
Базовий регістр (BX)
Регістр загального призначення BX є базовим регістром. Це єдиний регістр загального призначення, вміст якого може розглядатися як посилання на відповідну комірку пам'яті при розширеній адресації. Також може бути використаний разом з акумулятором для арифметичних та логічних операцій та проведення обчислень.
Регістр-лічильник (СХ)
Регістр загального призначення СХ – це регістр-лічильник, який є необхідним для керування числом повторень у циклах та при операціях зсування двійкових чисел. Також може бути використаний для арифметичних та логічних операцій та для проведення обчислень.
Регістр даних (DX)
Регістр загального призначення DX – це регістр даних, який застосовується для їх введення та виведення, для обчислень з подвійною точністю, або для операцій над великими числами при недостатній розрядності регістру АХ. Цей регістр також використовується як додатковий при множенні та діленні цілих чисел.
Регістр прапорів, або регістр стану (РС) Дев'ять з 16 біт регістра стану процесора Intel 8086 є активними та визначають стан процесора після виконання останньої команди. Більшість арифметичних та логічних команд, а також команди зрівняння даних змінюють значення прапорів регістра стану. Прапори регістра стану та їх призначення наведені у таблиці 1, а їх побітове розташування у комірках регістра – у таблиці 2:
Таблиця 1. Призначення прапорів регістра стану
№ |
Назва прапора |
Умовне |
|
|
п/п |
Українською мовою |
Англійською мовою |
Позна-чення |
Що визначає |
1 |
Прапор пере-повнення |
Overflow Flag |
ОF |
Наявність одиниці у цьому біті регістра стану вказує на переповнення старшого біта числа при виконанні арифметичних команд. |
2 |
Вказівник напрямку при виконанні операцій над рядками |
Direction Flag |
DF |
Визначає направлення пересилання або порівняння рядкових даних. При цьому направлення ліворуч відповідає збільшенню, а праворуч – зменшенню адрес комірок пам'яті. Значення 1 для прапора DF відповідає направленню праворуч. |
3 |
Прапор переривань |
Interrupt Flag |
IF |
Наявність одиниці у цьому біті регістра стану вказує на можливість виконання переривань від зовнішніх пристроїв, які маскуються. |
4 |
Прапор знаку |
Sign Flag |
SF |
Визначається знаком останньої арифметичної операції, яка була зроблена процесором (1 – від'ємне число, 0 – додатне число). |
5 |
Прапор нуля |
Zero Flag |
ZF |
Визначається результатом останньої арифметичної операції, яка була зроблена процесором. Нульовий результат обумовлює появу одиниці у цьому біті. |
6 |
Режим трасування (покрокового виконання програми) |
Trace Flag |
TF |
Наявність одиниці у цьому біті регістра стану забезпечує покрокове виконання завантаженої програми, що дозволяє програмісту аналізувати стан всіх регістрів процесора та комірок пам'яті після виконанні кожної асемблерної команди. Цей режим є дуже важливим при відлагодженні програм, але безпосередньо у програмах загального призначення він практично не використається. Єдиним виключенням є програми-компілятори. |
7 |
Зовнішнє перенесення |
Auxiliary Flag |
AF |
Визначається результатом останньої арифметичної операції, яка була зроблена процесором. Одиниця у цьому біті свідчить про перенесення з 3-го до 4-го біту числа при виконання операцій над 8-бітовими числами. Використовується при виконанні особливих арифметичних перевірок. |
8 |
Прапор перенесення |
Carry Flag |
CF |
Визначається результатом останньої арифметичної операції, яка була зроблена процесором. Одиниця у цьому біті свідчить про перенесення зі старшого восьмого біта при виконанні арифметичних операцій. При виконанні операцій циклічного зсуву до прапора перенесення переходить останній біт числа. |
9 |
Контроль парності числа |
Parity Flag |
PF |
Вказує на парність перших 8 бітів отриманого результату (1-результат є парним, 0 – не парним). Парність у програмуванні та теорії інформації - це кількість одиниць у двійковому числі. Не плутайте цей параметр з визначенням парності у арифметиці! Не плутайте також прапор парності процесора з бітом парності, який використовується для контролю передавання чисельних даних у комп’ютерних системах та мережах. |
Завдання для перевірки №1: Порівняйте поняття парності у звичайній та двійковій арифметиці. Наприклад, чи є парним число 3 з точки зору теорії інформації? Наведіть інші приклади парних та непарних чисел.
Таблиця 2. Розташування бітів регістра стану мікропроцесора Intel 8086
Номер біта |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Прапор |
* |
* |
* |
* |
OF |
DF |
IF |
TF |
SF |
ZF |
* |
AF |
* |
PF |
* |
CF
|
* - біт у процесорі Intel 8086 не задіяний.