
- •Основи програмування на мові асемблер та знайомство з програмним забезпеченням для виконання лабораторних робіт
- •Теоретичні відомості
- •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
МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ "КПІ"
МЕТОДИЧНІ ВКАЗІВКИ ДО ЛАБОРАТОРНИХ РОБІТ
З ДІСЦИПЛІНИ «Архітектура електронних обчислювальних машин»
для студентів ФТІ
ЗАТВЕРДЖЕНО
на засіданні методичної ради
ФТІ НТУУ "КПІ"
Протокол № "__" від "___"____________ _____ р.
Київ
Методичні вказівки до лабораторних робіт з дисципліни «Електронні пристрої обчислювальною техніки» для студентів-бакалаврів третього курсу факультету електроніки, кафедри електронних приладів та пристроїв / Укладач - Мельник І.В. — Київ: НТУУ "КПІ", 1999, — с.
Рецензент:
Редактор:
Підписано до друку Формат 60х84/16. Ум.-друк. арк.
Обл. вид. арк. . Тираж прим. Зам. № .
Видавництво
ВСТУП 5
Л а б о р а т о р н а р о б о т а №1 8
Основи програмування на мові асемблер та знайомство з програмним забезпеченням для виконання лабораторних робіт 8
Що визначає 10
ОF 10
DF 10
IF 10
Sign Flag 10
SF 10
ZF 10
Trace Flag 10
TF 10
AF 11
CF 11
PF 11
Л а б о р а т о р н а р о б о т а №2 25
Арифметичні та логічні операції мови асемблер 25
Л а б о р а т о р н а р о б о т а №3 43
Структура програми на мові асемблер. Команди вітвлення та циклу 43
Таблиця 19. Особливі арифметичні перевірки 48
Виведення даних на монітор персонального комп’ютера 54
4. Зміст звіту 66
ПЕРЕЛІК РЕКОМЕНДОВАНОЇ ЛІТЕРАТУРИ 67
ДОДАТОК 1 68
ЗАГАЛЬНІ ВИМОГИ ДО ОФОРМЛЕННЯ 68
ПРОТОКОЛІВ ЛАБОРАТОРНИХ РОБІТ 68
ДОДАТОК 2 69
ГОЛОВНІ ФУНКЦІЇ ПЕРЕРИВАННЬ BIOS ТА ОПЕРАЦІЙНОЇ СИСТЕМИ MS-DOS 69
Д2.3 ГОЛОВНІ ФУНКЦІЇ ПЕРИВАННЯ MS-DOS INT 21Н 70
ДОДАТОК 3 73
ВСТУП
Незважаючи на те, що наприкінці 90-х років широке розповсюдження знайшли Windows-подібні системи з розвинутим графічним інтерфейсом, у яких системне програмування здійснюється через обробку подій на рівні повідомлень операційної системи, а не через прямий доступ до пристроїв або використання переривань, все ж класичні методи програмування зовнішніх пристроїв з використанням мови низького рівня асемблер і досі мають велике значення при створенні, наприклад, програм низькорівневого системного керування або драйверів зовнішніх пристроїв. Тому базові приклади, наведені у методичному посібнику, написані для роботи під операційною системою MS-DOS, але більшість з них є Windows-сумісними.
При написані посібника для полегшення читання матеріалу автор намагався дотримуватися таких правил:
Головні тези та формуліровки, а також головні поняття виділені жирним шрифтом, у деяких випадках – виділені жирним шрифтом та підкреслені.
Правила та інші узагальнюючи положення, на які треба звернути увагу, написані курсивом, у деяких випадках – жирним курсивом.
Крім стандартних контрольних питань посібник містить велику кількість завдань для перевірки глибини засвоєння матеріалу на практиці. Ці завдання розташовані безпосередньо у тексті робіт та виділені сірим кольором. Хоча їх виконання не є обов’язковим, але студентам, які хочуть досконало вивчити та зрозуміти наведений матеріал, бажано виконати ці нескладні тестові завдання.
При написані формату тієї чи іншої асемблерної команди у квадратні дужки бралися словосполучення, які визначають єдиний об’єкт у коді асемблерної команди, а у фігурні - частини команди, які можна не використовувати.
Коментарі у прикладах програм написані дрібним курсивом.
У тексті посібника коди команд та директиви асемблера виділені жирним шрифтом та написані прописними літери (наприклад, команда ADD, директива ASSUME).
Робочі фрагменти асемблерних програм написані курсивом, прописними літерами. Там, де визначення кодів асемблерних команд не є суттєвим для наведеного приклада, вони замінені крапками.
Матеріал лабораторної роботи №1 спрямований на вивчення загальних основ програмування на асемблері та необхідного для цього програмного забезпечення - трансляторів з мови асемблер (на прикладі програми Turbo-Assembler) та засобів відлагодження асемблерних програм, які призначені для переведення двійкових машинних кодів у відповідні асемблерні команди (на прикладі програм AFD та Turbo-Debugger) [1,4,8,9].
Матеріал лабораторної роботи №2 спрямований на вивчення асемблерних команд визначення даних, а також арифметичних та логічних операцій мови програмування асемблер [4,7-9].
Матеріал лабораторної роботи №3 спрямований на вивчення команд вітвлення та циклу мови програмування асемблер. Головна мета цієї роботи – навчити студентів писати програми з нетривіальною логікою за запропонованим алгоритмом [4,7-9].
Матеріал лабораторної роботи №4 спрямований на вивчення системи переривань MS-DOS та BIOS та засобів виведення текстової та чисельної інформації на екран монітору через безпосередній доступ до відеопам’яті та через використання апаратних та системних переривань [3-5, 10].
Загальні вимоги для оформлення студентами протоколів лабораторних робіт наведені у додатку 1. Крім того, окремі вимоги до змісту звітів по кожній роботі сформульовані у розділах “Зміст звіту” описів цих робіт.
Матеріал лабораторних робіт базується на знанні студентами основ програмування та теорії інформації, особливо таких розділів, як архітектруктура ЕОМ, теорія алгоритмів та системи числення.
Матеріал посібника містить лише одну лабораторну роботу, в якій безпосередньо розглядається робота з зовнішніми пристроями ЕОМ (лабораторна робота №4). Проте велика увага приділяється здійсненню арифметичних та логічних операцій над чисельними даними (у лабораторній роботі №2) та побудові алгоритму поставленої задачі (у лабораторній роботі №3). За думкою автора ці питання є найважливішими при постановці будь-якої задачі програмування зовнішніх пристроїв з метою організації їх роботи за заданим алгоритмом, але нажаль саме на них не звертається необхідної уваги в учбовій літературі по програмуванню.
Слід відзначити також, що питання програмування стандартних зовнішніх пристроїв ЕОМ (монітору, клавіатури, дисководів тощо) через використання переривань MS-DOS та BIOS або шляхом безпосереднього доступу до них, досить вдало розглянуті у довідниковій літературі, яка була опублікована на початку 90-х років [3-5, 8-10]. Всі ці книжки одразу ж після опублікування знайшли великий попит і стали “бестселерами”, їх навіть сьогодні називають “настільними книгами програмістів”. Дуже рекомендую всім студентам звернутися до них! Ви знайдете там багато цікавого та корисного матеріалу, який допоможе Вам не тільки досконало вивчити комп’ютер як складну апаратно-програмну систему, але й найголовніше навчитися писати ефективні та елегантні програми для керування зовнішніми комп’ютерними пристроями. Оскільки з кожним роком з’являються нові апаратні засоби персональних комп’ютерів, а старі суттєво модернізуються та удосконалюються, для роботи на сучасному рівні необхідно звертатися і до теперішніх видань, в яких розглядаються апаратні засоби ЕОМ. Серед таких книжок можна порадити монографію-довідник [11].
Всі наведені у посібнику прикладу програм орієнтовані на систему команд мікропроцесора Intel 8086, який був створений на початку 80-х років і став базовим процесором персональних комп’ютерів типу IBM PC XT і “засновником” родини мікропроцесорів 80х86 фірми Іntel. Незважаючи на те, що мова мікропроцесорів 80386 та і486 є більш вдосконаленою і містить складні операції для обробки чисел з плавоючою комою, всі елементарні математичні функції, додоткові можливості по адресації пам’яті тощо, класичний підхід з орієнтацією на програмування 16-розрядного процесора Intel 8086 за думкою автора має певні переваги. По-перше, всі робочі програми, що написані для цього процесора, можуть працювати без будь-яких змін і на процесорах старших поколінь. По-друге, мова асемблера процесора Intel 8086 не перевантажена великою кількістю команд, що робить її простою для вивчення та розуміння [3-5]. І в решті решт, глибоке знання архітектури та основ програмування мікропроцесора Intel 8086 полегшає вивчення системи команд процесорів старших поколінь фірми Intel. Для студентів, які досконало вивчили мову асемблера процесора Intel 8086 і мають бажання познайомитись з програмуванням процесорів старших поколінь, автор може порекомендувати монографії та учбові посібники [2,6,12].
Невеликий обсяг курсу (один семемтр) не дозволів автору розглянути на практиці всі тонкощі такої різноманітної та багатограної мови програмування, як асемблер. Наприклад, зовсім не розглянуті макрокоманди. Такі важливі аспекти програмування, як виклик процедур та операції зі стеком не виділені у окремі розділи лабораторних робіт, хоча на них і загострюється увага. Майже не розглядаються арифметичні операції над числами подвійної довжини та над числами з фіксованою та плавоючою комою. Всі ці питання теж досить досканало розглянуті в учбовій літературі [1,3].
Треба відзначити, що автор намагався при складанні посібника дотримуватися органічної цільності усього циклу лабораторних робіт. Так, дані, отримані як результати розрахунків у лабораторній роботі № 2 використовуються як початкові для третьої роботи, де реалізуються більш складні алгоритми вітвлень та циклів, а остаточний результат виводиться на екран монітору через безпосередній доступ до відеопам’яті або через систему переривань (робота №4). Така суцільність, на думку автора, не тільки розвиває у студента вміння створювати складні програмні системи через написання та відлагодження їх простих фрагментів, але й взагалі формує системний погляд на світ та його складові частини, впливаючи на розвиток майбутнього інженера та вченого як особистості. Зрозуміло, для цього не достатньо чотирьох лабораторних робіт односеместрового курсу, навіть якщо студент скрупульозно виконував всі завдання для перевірки і відповів на всі контрольні питання. Якщо Вам дійсно сподобалось системне програмування – звертайтеся до книжок та науково-технічних журналів, поповнюйте та поглиблюйте свої знання, ще і ще раз пробуйте програмувати самі. Якщо ви будете наполегливі та працьовиті – до Вас обов’язково прийде вдача, і Ви відчуєте справжнє задоволення, коли зрозумієте, як за допомогою кількох десятків чи сотен програмних рядків можна “підкорити” навіть таку складну і досконалу систему, як комп’ютер, заставляючи його коректно працювати. І це буде не якесь тимчасове задоволення – а дійсна радість від дотику до найновітніших та найглибших досягнень сучасної світової культури та технічних знань людства.
Нажаль, часто-густо в учбовій літературі [3,4,7,8] зустрічаються прикрі помилки у текстах асемблерних програм. Деякі з них були знайдені та виправлені автором при підготуванні методичних вказівок. Всі наведені у посібнику приклади програм були відтестовані на протязі двох років при проведенні лабораторних занять зі студентами кафедри “Електронні прилади та пристрої” факультету електроніки НТУУ “КПІ” та зі студентами спеціальності “Інформатика” фізико-технічного факультету.
І в решті решт, хочу виразити подяку професору кафедри “Електронні системи” НТУУ “КПІ” Терещенко Т.О., та своєму другу, доценту кафедри “Інформаційні технології проектування” Лунтовському А.О. за цінні поради, наданий ними учбово-методичний матеріал та за загальну підтримку всієї праці, а також завідуючому кафедри “Електронні прилади та пристрої” професору Денбновецькому С.В. за цінні зауваження по змісту методичних вказівок.
Л а б о р а т о р н а р о б о т а №1
Основи програмування на мові асемблер та знайомство з програмним забезпеченням для виконання лабораторних робіт
Мета роботи: Знайомство з структурою персонального комп’ютера та основами програмування на мові асемблера. Студенту треба навчитися працювати з програмою-транслятором 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 не задіяний.