- •Основи програмування на мові асемблер та знайомство з програмним забезпеченням для виконання лабораторних робіт
- •Теоретичні відомості
- •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
3. Порядок виконання роботи
Проаналізувати індивідуальне завдання та написати програму на мові асемблера. З’ясувати, як будуть змінюватися дані в усіх регістрах процесора при виконанні кожної з команд програми.
Сформувати виконуваний модуль за допомогою програми TASM.
Запустити програму на обробку. Переконайтеся у тому, що її коректно виконується (комп’ютер не «підвисає»).
Завантажити програму до відладчика AFD або TASM та крок за кроком виконати усі її команди. Після виконання кожної з команд проаналізувати стан кожного з регістрів процесору.
4. Зміст звіту
Роздрукована програму на мові асемблера.
Таблиця результатів з трьох колонок. У першу занести початковий код асемблерної програми, в другу - її машинний код, в третю - стан усіх регістрів процесору після її виконання.
Чисельне значення усіх комірок пам’яті, у яких розташована програма. З’ясувати, чому до них були завантажені саме такі числа.
Висновки за роботою.
5. Контрольні питання
Які Ви знаєте арифметичні команди мови асемблер? Як вони записуються? Які мають операнди? Який результат їх виконання?
Які Ви знаєте логічні команди мови асемблер? Як вони записуються? Які мають операнди? Який результат їх виконання?
Які Ви знаєте команди зсуву бітів числа у мові асемблер? Як вони записуються? Які мають операнди? Який результат їх виконання?
Стекова організація пам’яті, її особливості. Які Ви знаєте команди мови асемблера для роботи зі стеком?
Команди виклика процедури та повернення з неї.
Особливості написання com та exe виконуємих модулей мовою асемблера.
Виконати завдання для перевірки 1-12.
Л а б о р а т о р н а р о б о т а №3
Структура програми на мові асемблер. Команди вітвлення та циклу
Мета роботи: Навчитися створювати програми з нетривіальною логікою на мові асемблер, реалізуючи запропонований алгоритм за допомогою команд вітвлення та циклу.
Необхідні знання та практичні навички: Знання основ побудови алгоритмів, які містять команди вітвлення та циклу, та можливостей реалізації таких команд на мові асемблера мікропроцесорів Intel 80х86 [1-4]. Студентам обов’язково треба відновити свої знання з таких розділів курсу “Персональні комп’ютери та основи програмування”:
“Поняття алгоритму”
“Побудова алгоритму поставленої задачі”
“Запис алгоритму через тезові формуліровки”
“Блок-схеми алгоритмів”,
а також з розділів “Регістр стану мікропроцесора Intel 8086” та “Представлення від’ємних чисел у двійковій арифметиці”, які розглядалися у лабораторних роботах №1 та №2.
1. Теоретичні відомості
1.1 Механізми передачі керування та зміна послідовності виконання команд. Їх реалізація у мові асемблера. Типи адресації
До цього моменту Ви працювали лише з асемблерними програмами, які мали тривіальну логіку і всі команди в них виконувались послідовно. Проте більшість з задач програмування не є такими тривіальними. Як вам відомо, складні структурні алгоритми завжди містять безліч команд, які змінюють послідовність виконання інструкцій програми, як-то:
перевірки та вітвлення, що визначають, яку послідовність дій з кількох визначених треба виконати при отриманих результатах розрахунків;
цикли, в яких визначена послідовність команд повторюється багато разів для досягнення необхідного результату, який визначається за певними вимогами.
Особливість цих команд полягає в тому, що вони потребують передачі керування на іншу частину програми, яка знаходиться не безпосередньо після команди, що виконується. Така передача керування в програмі може здійснюватись вперед для виконання нової групи команд або назад для повторного виконання вже виконаних команд. При передачі керування певним чином змінюються всі базові регістри процесора, в тому числі лічильник команд (командний вказівник) та регістри адрес. Як вам відомо з теорії алгоритмів, програми, які містять вітвлення та цикли, треба писати дуже охайно. Некоректна передача керування приводить не тільки до отримання невірних результатів, але в багатьох випадках до некоректного виконання всієї програми. Одним з прикладів таких помилок є так звані «вічні цикли».
Більш того, коректність написання програми і вірність отриманих результатів для програм зі складною логікою ще не свідчать про те, що написана програма є оптимальною. Серед стандартних помилок програмістів, які не мають досвіду програмування, потрібно вказати такі:
включення до циклу команд, які можна було б без зміни логіки алгоритму винести за межі циклу. При великій кількості повторень команд циклу така помилка програмування приводить до значного збільшення часу виконання програми;
використання перевірок, які при значеннях даних, визначених програмістом, завжди будуть давати однаковий результат. Така помилка майже не впливає на хід виконання програми, але ускладнює її розуміння іншою людиною та редагування. Наприклад, немає ніякого сенсу послідовно розташовувати два оператора, перший з яких перевіряє чи є число в регістрі AX додатним, а другий, чи є те ж саме число від’ємним (поясніть чому);
реалізація циклічного процесу через команди умовного та безумовного переходів в тих випадках, коли це можливо зробити через команду організації циклу. Така помилка також значно ускладнює розуміння програми, хоча і не впливає на коректність її виконання;
некоректне звернення до комірок пам’яті при обробці в циклах даних зі складною структурою та рядків великої довжини, яке приводить до отримання невірних результатів, а при програмуванні на мові асемблера навіть до збоїв у роботі програми («підвисання» комп’ютера або аварійне завершення з виведенням на монітор коду системної помилки MS-DOS).
В більшості випадків таких прикрих помилок можна уникнути, якщо починати вирішення поставленої задачі не безпосередньо з програмування, а з її аналізу та побудови алгоритму рішення. Дуже допомагають при цьому як визначення алгоритму за допомогою тезових формуліровок та їх систематизації (нумерації пунктів алгоритму та визначення переходів на той чи інший пункт), так і використання блок-схем алгоритму. Тому побудова алгоритму виконання задачі та його блок-схеми є необхідною умовою виконання цієї роботи.
У мові асемблера існують команди, які передають керування в програмі через безпосередню зміну адреси у лічильнику команд (для процесора Intel 8086 через зміну зміщення у командному вказівнику). Для організації циклів та вітвлення передбачено три головних засоби передачі керування:
-
1. Безумовний перехід
Команда JMP
2. Умовний перехід
Команди Jxxx (перехід при певних значеннях прапорів регістра стану)
3. Організація циклу
Команда LOOP
В асемблері існує три типа зміни адрес при передачі керування в програмі, які називаються типами адресацій: SHORT, NEAR та FAR.
SHORT - це найкоротша адресація в межах циклу. Допускає зміщення на 128 байт в напрямку зменшення адрес (зміщення вгору) або на 127 байт в напрямку зменшення адрес (зміщення вниз). Використовується в циклах по замовченню та може бути використана в командах умовного та безумовного переходу, а в деяких випадках навіть при викликах функцій та процедур.
NEAR - це коротка адресація в межах сегмента. В циклах не може бути використана. Використовується в командах безумовного переходу, якщо в них не визначена адресація типу SHORT. Може також бути використана для виклику функцій та процедур. Якщо ваша програма написана в межах одного сегмента, то адресація NEAR дозволяє передавати керування в будь-яку точку програми.
FAR - передача керування за межу сегмента. В деяких випадках цей тип адресації використовується для виклику функцій та процедур.
Як можна побачити, всі три типа адресації змінюють адресу в командному вказівнику IP, а тип адресації FAR змінює також регістр сегменту CS.
