- •Теоретичні відомості
- •1. Структура простої програми мовою асемблера. Формат кодування програми.
- •2. Основні директиви : segment , end, ends, proc, endp, assume.
- •3. Основні вимоги при створенні програми. Приклади простих програм мовою асемблера.
- •4. Трансляція програми. Опції компіляції та загальна характеристика.
- •6. Застосування програми налагодження для пошуку помилок.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи
- •Теоретичні відомості
- •1. Директиви визначення даних.
- •2. Директива повторення dup.
- •3. Сталі.
- •5. Представлення в пам’яті цілих чисел.
- •6. Команда пересилки даних mov.
- •7. Команди двійкового додавання та віднімання.
- •Команда зміни знаку операнда neg
- •8. Обчислення цілих арифметичних виразів.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Теоретичні відомості
- •1. Команда безумовного переходу jmp. Типи адресів переходу short,near та far.
- •2. Команди організації циклів ( loop,loopn,loopnz). Команда loop. Керування циклом за ecx/cx.
- •Керування циклом за ecx/cx із врахуванням ознаки zf
- •3. Команди умовних переходів.
- •5. Команда lea
- •Команда роботи зі стеком push та pop
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Логічні операції та операції зсувів.
- •2. Команди логічних операцій (and, test, or, xor, not).
- •3. Команди зсувів та циклічних зсувів.
- •Команди зсувів (sal, sar, shl,shr)
- •Команда зсуву логічного операнда вправо – shr
- •3.2 Команди циклічних зсувів (rol, ror ,rcl, rcr). Циклічний зсув операнда вліво - rol
- •Циклічний зсув операнда вправо ror
- •Циклічний зсув операнда вліво через ознаку переносу - rcl
- •Циклічний зсув операнда вправо через ознаку переносу – rcr
- •Бітові маски.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи
- •1. Множення цілих чисел
- •2. Ділення цілих чисел
- •3. Перетворення в регістрах
- •Алгоритм введення–виведення цілих чисел
- •Виведення цілих чисел.
- •Введення цілих чисел.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Теоретичні відомості
- •Особливості команд обробки рядків.
- •Ознака df. Команди зміни ознаки ( cld, std ).
- •Префікси повторення( rep, repe, repz, repne, repze ).
- •Команди обробки символьних рядків
Завдання для самостійної роботи.
Задано цілі беззнакові числа a та b , цілі знакові c та d. Побудувати блок –схему та написати процедуру обчислення виразу :
|
|
|
|
1 |
|
|
а = 44 b =103 c = -34 d = 625 |
2 |
|
|
а = 554 b =103 c = 304 d = -66 |
3 |
|
|
а = 344 b =58 c = -300 d = 225 |
4 |
|
|
а = 13 b =26 c = -255 d = 615 |
5 |
|
|
а = 64 b =783 c = 454 d = -89 |
6 |
|
|
а = 54 b =16 c = -34 d = -62 |
7 |
|
|
а = 87 b =89 c = -87 d = -64 |
8 |
|
|
а = 76 b =48 c = -484 d = 382 |
9 |
|
|
а = 484 b =34 c = 433 d = -43 |
10 |
|
|
а = 10 b =13 c = -18 d = 676 |
11 |
|
|
а = 44 b =103 c = -34 d = 625 |
12 |
|
|
а = 554 b =103 c = 304 d = -66 |
13 |
|
|
а = 344 b =58 c = -300 d = 225 |
14 |
|
|
а = 13 b =26 c = -255 d = 615 |
15 |
|
|
а = 64 b =783 c = 454 d = -89 |
16 |
|
|
а = 54 b =16 c = -34 d = -62 |
17 |
|
|
а = 87 b =89 c = -87 d = -64 |
18 |
|
|
а = 76 b =48 c = -484 d = 382 |
19 |
|
|
а = 484 b =34 c = 433 d = -43 |
20 |
|
|
а = 10 b =13 c = -18 d = 676 |
2. Побудувати блок –схему та написати процедуру обчислення суми виразу
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
3. Задано два впорядкованих за зростанням масиви X, Y розмірності n написати програму, що :
дописує масив X до масиву Y;
дописує масив Y до масиву X;
об’єднує в один впорядковані за зростанню масиви;
додає до компонент масиву X відповідні компоненти масиву Y.
додає до компонент масиву Y відповідні компоненти масиву X.
віднімає від компонент масиву X відповідні компоненти масиву Y.
додає до компонент масиву Y найбільший елемент масиву X.
Задано масив X розмірності n беззнакових цілих чисел. Написати програму :
впорядкування за спанням елементів масиву;
впорядкування за не зростанню елементів масиву;
знаходження найбільшого та найменшого елемента масиву;
знаходження різниці між найбільшим та найменшим елементом масиву;
кількість нульових елементів;
знаходження суми елементі масиву.
Задано масив X розмірності n знакових цілих чисел. Написати програму :
впорядкування за спадання елементів масиву;
впорядкування за не зростанням елементів масиву;
знаходження суми найбільшого та найменшого елемента масиву;
суму додатних елементів масиву;
додає до компонент масиву його найбільший елемент;;
суму від’ємних елементів масиву.
Лабораторна робота № 4.
Тема: Введення-виведення символів та рядків
Мета. Ознайомлення з можливостями введення–виведення текстової інформації за допомогою DOS та BIOS переривання. Розглянути способи виведення інформації на екран та введення з клавіатури.
План заняття :
Виведення символів та рядків.
Введення символів та рядків з клавіатури.
Задачі введення – виведення символів та символьних рядків та їх обробка.
Література : [1] c. 34-60; [2] c. 26-38; [3] c. 22-36; [4] c. 17-21, 124-127,142-145.
Теоретичні відомості
1.Виведення символів та рядків. Виведення інформації в програмах мовою асемблера здійснюється за допомогою сервісних функцій DOS (переривання 21h) або BIOS (переривання 10h). Процес виведення полягає в наступному:
у визначені регістри процесора завантажуються символ( який виводиться), або адреса буфера символьного рядка( який виводиться );
у регістр AH заноситься номер функції для здійснення операції виведення ;
викликається переривання.
Нижче представлений перелік функції переривань 21h і 10h, які використовуються для виведення інформації.
Переривання 21h.
Функція 02h
Виведення символу
Вхід: AH=02h
DL= символ, що виводиться
Вихід: немає
Опис: Функція переривання виводить символ з DL на стандартний пристрій виведення. Обробляє символ Backspace (ASCII 8), переміщаючи курсор уліво на одну позицію і залишаючи його в новій позиції.
Функція 05h
Виведення на принтер.
Вхід: AH=05h
DL= символ, що виводиться
Вихід: немає
Опис: Функція переривання виводить символ із регістра DL на стандартний пристрій друку. За замовченням це пристрій, який приєднаний до пристрою LPT1. Команда DOS MODE може перенаправляти це виведення.
Функція 09h
Введення рядка.
Вхід: AH = 09h
DS:DX = адреса символьного рядка, що закінчується символом '$'.
Вихід: немає
Опис: Рядок, крім символу '$', виводиться на стандартний пристрій виведення. Символи Backspace обробляються як у функції 02h. Щоб перейти на новий рядок, у текст включають пару символів керування знаків CR/LF (ASCII 13H і ASCII 0a).
Переривання 10h.
Установка курсору
Функція 02h
Вхід: AH=02h
BH = відео сторінка
DH,DL = рядок, стовпчик (вважаючи від 0)
Вихід: немає
Опис: Установлює курсор у позицію DH,DL. Установка курсору на рядок 25 робить курсор невидимим.
Функція 09h
Виведення символ/атрибут у поточній позиції курсору.
Вхід: AH=09h
BH = номер відео сторінки
AL = записуваний символ
CX = лічильник (скільки екземплярів символу записати)
BL = відео атрибут (текст) або колір (графіка)
Вихід: немає
Опис: Виводить на екран у поточну позицію курсору символ із заданим атрибутом.
Функція 0ah
Виведення символ у поточній позиції курсору.
Вхід: AH=0ah
BH = номер відео сторінки
AL = записуваний символ
CX = лічильник (скільки екземплярів символу записати)
Вихід: немає
Опис: Виводить на екран у поточну позицію курсору заданий символ.
Функція 13h
Виведення рядка.
Вхід: AH=13h
ES:BP – виведений рядок
CX = довжина рядка (підраховуються тільки символи)
DH,DL = позиція (рядок, стовпчик) початку висновку
BH = номер сторінки
AL = код під функції:
0=атрибут у BL; курсор без зміни
1=атрибут у BL; курсор – у кінець рядка
2=формат рядка: char, attr,...; курсор без зміни
3=формат рядка: char, attr,...; курсор – у кінець рядка
Вихід: немає
Опис: Виводить рядок з позиції курсору. Символи 0d (CarRet), 0a (LineFeed), 08H (backspace) і 07H (Beep) трактуються як команди керування і не відображаються.
Деякі функції переривання 10h використовують для виведення атрибут символу. Для кольорових адаптерів в текстовому режимі атрибут визначений у такий спосіб:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
fgB |
background |
brt |
foreground |
foreground – колір переднього плану (від 0 до 0f)
brt – інтенсивність: 1=передній план яскравості
background – фоновий колір (від 0 до 7)
fg – мерехтіння: 1=передній план мерехтіння
Відеоадаптер підтримує наступні кольори:
00H –чорний 01H –синій 02H –зелений 03H –голубий 04H –червоний 05H –рожевий 06H –коричневий 07H –сірий |
08H –темно-сірий 09H –яскраво-синій 0aH –світло-зелений 0bH –світло-блакитний 0cH –світло-червоний 0dH –світло-рожевий 0eH –жовтий 0fH –білий |
Обчислити значення атрибута можна, використовуючи наступний вираз:
(фон * 16) + передній план + (128 для мерехтіння)
Приклад. Приведений нижче фрагмент програми ілюструє процес виведення рядка на екран.
mov AH,09H ;Вибір функції переривання
mov DX,OFFSET STR ;Занесення в DX адреси
; виведеного рядка
INT 21H ; виклик переривання
. . .
STR DB 10,13,'Hello$' ;Опис рядка
2. Введення символів та рядків з клавіатури. Процес введення інформації в програмах мовою асемблера здійснюється за наступним алгоритмом:
у регістр AH заноситься номер функції введення;
для введення рядка, в регістр DX адреса буфера введення;
викликається переривання, після виконання якого введена інформація записується у визначені регістри, або визначений буфер.
Нижче описаний ряд функцій переривання 21h, які використовуються для введення інформації з клавіатури.
Функція 01h
Введення з клавіатури.
Вхід: AH=02h
Вихід: AL= символ, отриманий із клавіатури
Опис: Читає символ зі стандартного вхідного пристрою. Відображає цей символ на стандартний вихідний пристрій (відлуння). Введення розширених клавіш ASCII (F1-F12, PgUp, курсор і т.п.) вимагає двох звертань до цієї функції. Перший виклик повертає AL=0. Другий виклик – повертає в AL розширений код ASCII.
Функція 07h
Не фільтроване консольне введення без відлуння.
Вхід: AH=07h
Вихід: AL= символ, отриманий із клавіатури
Опис: Читає символ зі стандартного вхідного пристрою та записує прочитаний символ у AL. Функція не фільтрує вхідні символи. Не перевіряє на Ctrl-Break, backspace і т.п. Необхідно викликати двічі для введення розширеного символу ASCII.
Функція 08h
Консольне введення без відлуння.
Вхід: AH=08h
Вихід: AL= символ, отриманий із клавіатури
Опис: Читає символ зі стандартного вхідного пристрою та записує прочитаний символ у AL. При виявленні Ctrl-Break виконується переривання INT 23H. Необхідно викликати двічі для введення розширеного символу ASCII.
Функція 0ah
Буферизоване введення рядка.
Вхід: AH=0ah
DS:DX =адреса вхідного буфера (дивися нижче)
Вихід: буфер містить уведення, що закінчується символом CR (ASCII 0d)
Опис: При вході буфер за адресою DS:DX повинний бути оформлений у такий спосіб:
Max |
? |
? |
? |
? |
? |
? |
… |
MAX - максимально припустима довжина введення (від 1 до 254) При виході буфер заповнений даними в такий спосіб:
Max |
Len? |
T |
E |
X |
T |
… |
0dh |
LEN - дійсна довжина даних без завершального CR (тут – 0d).
Символи зчитуються зі стандартного пристрою введення до повернення каретки CR (ASCII 0d), або до досягнення довжини MAX-1. Якщо досягнуто довжини MAX-1, включається консольний дзвоник для кожного чергового символу, до тих пір поки не буде введене повернення каретки CR (натискання клавіші Enter). Другий байт буфера заповнюється дійсною довжиною введеного рядка, не враховуючи повернення каретки CR. Останній символ у буфері – завжди CR (який не враховується у байті довжини). Символи в буфері (включаючи LEN) у момент виклику використовуються як «шаблон». У процесі введення можна використовувати клавіші редагування: Esc видає "\" і починає з початку, F3 видає буфер до кінця шаблона, F5 видає "@" і зберігає поточний рядок як шаблон, і т.д. Більшість розширених кодів ASCII ігноруються. При розпізнаванні Ctrl-Break виконується переривання INT 23H (буфер залишається незмінним).
Функція 0ch
Введення з очищенням
Вхід: AH=0ch
AL= номер функції введення (01H, 06H, 07H, 08H або 0aH)
Вихід: немає
Опис: Очищає буфер попереднього введення із стандартного пристрою введення, а потім викликає функцію введення, яка задана в AL. Це змушує систему очікувати введення чергового символу.