- •Лабораторна робота 1.
- •1. Символи.
- •2 Представлення чисел у пам’яті пеом.
- •2.1 Цілі числа. Цілі числа без знака
- •2.2 Цілі числа зі знаком
- •3 Дійсні числа.
- •3.1 Представлення дійсних чисел у двійковому нормалізованому виді.
- •3.2 Машинні формати дійсних чисел
- •3.2.1. Формат 32 біти - float (або single)
- •3.2.2. Формат 64 біти - double
- •4. Завдання на лабораторну роботу.
- •5. Методичні вказівки з оформлення звіту
- •6. Рішення типового прикладу (без оцінки похибки перетворення)
- •7. Питання для самоперевірки
- •8. Література
- •Лабораторна робота 2.
- •1. 3 Формати файлів, що виконуються, які підтримуються у fasm
- •2. Завдання на лабораторну роботу:
- •3. Методичні вказівки з оформлення звіту
- •4. Питання для самоперевірки.
- •Лабораторна робота 3.
- •1. Підготовка до роботи.
- •2. Питання для самоконтролю.
- •3. Короткі теоретичні відомості.
- •3.1 Команди пересилання даних.
- •3.1.3 Операції зі стеком:
- •3.2 Робота із налагоджувачем OllyDbg.
- •3.2.2. Розглянемо основні команди меню OllyDbg.
- •4. Завдання на лабораторну роботу.
- •9. Література
- •Лабораторна робота 4.
- •3.2. Операції із прапорами процесора:
- •3.3 Команди розповсюдження знаку
- •4. Методичні вказівки з оформлення звіту
- •5. Рішення типового прикладу.
- •6. Завдання на лабораторну роботу
- •7. Критерії оцінювання.
- •8. Питання для самоперевірки
- •9. Література
- •Лабораторна робота 5.
- •3.2. Команди зсуву
- •3.3 Команди сканування бітів
- •4. Методичні вказівки з оформлення звіту
- •5. Приклади використання бітових команд
- •6. Завдання на лабораторну роботу
- •7. Критерії оцінювання.
- •8. Питання для самоперевірки
- •9. Література
- •Лабораторна робота 6.
- •1. Підготовка до роботи.
- •2. Питання для самоконтролю.
- •3. Короткі теоретичні зведення.
- •3.1. Команди безумовної передачі управління
- •3.1.1. Команда безумовного переходу jmp
- •3.2. Команди умовної передачі управління Jcc
- •3.2.1. Перша група команд умовного переходу.
- •3.2.2 Друга група команд умовного переходу.
- •3.2.3. Третя група команд умовного переходу.
- •3.3. Команди управління циклами looPx
- •3.3.1. Команда loop — перехід по лічильнику
- •3.3.2. Команда loope (loopz) перехід по лічильнику і якщо дорівнює
- •3.3.3. Команда loopne (loopnz) перехід по лічильнику і якщо не дорівнює
- •4. Методичні вказівки з оформлення звіту
- •5. Приклади використання бітових команд
- •6. Завдання на лабораторну роботу.
- •7. Критерії оцінювання.
- •8. Питання для самоперевірки
- •9. Література
- •Лабораторна робота 7.
- •1. Підготовка до роботи.
- •2. Питання для самоконтролю.
- •3. Короткі теоретичні відомості.
- •3.1. Реалізація основних операцій по обробці масивів мовою асемблера.
- •4. Методичні вказівки з оформлення звіту
- •5. Критерії оцінювання.
- •6. Завдання на лабораторну роботу.
- •7. Питання для самоперевірки
- •8. Література
- •Лабораторна робота 8.
- •1. Підготовка до роботи.
- •2. Питання для самоконтролю.
- •3. Короткі теоретичні відомості.
- •4. Приклади виконання деяких типових задач обробки рядків
- •4. Завдання на лабораторну роботу.
- •Лабораторна робота 9.
- •1. Підготовка до роботи.
- •2. Питання для самоконтролеві.
- •3. Короткі теоретичні відомості
- •3.1. Принципи організації підпрограм
- •3.2. Параметри процедур і значення, що повертаються
- •3.3. Використання загальних перемінних у процедурах
- •3.4. Особливості fasm по організації підпрограм (Windows - додатка).
- •Лабораторна работа 10-11.
- •3.1.2. Засобу bios
- •3.2. Уведення з клавіатури
3.2. Уведення з клавіатури
3.2.1. Засобу DOS. Як і у випадку виводу на екран, DOS надає набір функцій для читання даних із клавіатури, що використовують стандартний пристрій уведення STDIN, так що можна використовувати як джерело даних файл або стандартний вивід іншої програми.
Функція DOS 0Ah — Вважати рядок символів з STDIN у буфер
Уведення: |
АН = 0Ah DS: DX = адреса буфера |
Вивід: |
Буфер містить уведений рядок |
Для виклику цієї функції треба підготувати буфер, перший байт якого містить максимальне число символів для введення (1 – 254), а вміст, якщо воно задано, може використовуватися як підказка для введення. При наборі рядка обробляються клавіші Esc, F3, F5, BS, Ctrl-C/Ctrl-Break і т. д., як при наборі команд DOS (тобто Esc починає введення спочатку, F3 відновлює підказку для введення, F5 запам'ятовує поточний рядок як підказку, Backspace стирає попередній символ). Після натискання клавіші Enter рядок (включаючи останній символ CR (0Dh)) записується в буфер, починаючи з третього байта. В другий байт записується довжина реально введеного рядка без обліку останнього CR.
Розглянемо приклад програми, що виконує перетворення десяткового числа в шестнадцатеричное.
Приклад 3
; dosinl. asm
org 100h ; початок Сома-файлу
use16
start:
mov dx, messagel
mov ah,9
int 21h ; вивести запрошення до введення message1
mov dx, buffer
mov ah,0Ah
int 21h ; вважати рядок символів у буфер
mov dx, crlf
mov ah,9
int 21h ; переклад рядка
; переклад числа в ASCII-форматі з буфера в бінарне число в АХ
xor di, di ; DI = 0 - номер байта в буфері
xor ax, ax ; АХ = 0 - поточне значення результату
mov cl,[blength]
xor ch, ch
xor bx, bx
mov si, cx ; SI - довжина буфера
mov cl,10 ; CL = 10, множник для MUL
asc2hex:
mov bl, byte [bcontents+di]
sub bl,'0' ; цифра = код цифри - код символу “0”,
jb asc_error ; якщо код символу був менше, ніж код “0”,
cmp bl,9 ; або більше, ніж “9”,
ja asc_error ; вийти з програми з повідомленням про помилку,
mul cx ; інакше: помножити поточний результат на 10,
add ax, bx ; додати до нього нову цифру,
inc di ; збільшити лічильник
cmp di, si ; якщо лічильник+1 менше числа символів -
jb asc2hex ; продовжити (лічильник вважається від 0)
; вивід на екран рядка message2
push ax ; зберегти результат перетворення
mov ah,9
mov dx, message2
int 21h
pop ax
; вивід на екран числа з регістра АХ
push ax
xchg ah, al ; помістити в AL старший байт
call print_al ; вивести його на екран
pop ax ; відновити в AL молодший байт
call print_al ; вивести його на екран
ret ; завершення Сома-файлу
asc_error:
mov dx, err_msg
mov ah,9
int 21h ; вивести повідомлення про помилку
ret ; і завершити програму
; Процедура print_al
; виводить на екран число в регістрі AL
; у шестнадцатеричном форматі,
; модифікує значення регістрів АХ і DX
print_al:
mov dh, al
and dh,0Fh ; DH - молодші 4 біти
shr al,4 ; AL - старші
call print_nibble ; вивести старшу цифру
mov al, dh ; тепер AL містить молодші 4 біти
print_nibble: ; процедура виводу 4 бітів (шестнадцатеричной цифри)
cmp al,10 ; три команди, що переводять цифру в AL
sbb al,69h ; у відповідний ASCII-код
das ; (див. опис команди DAS)
mov dl, al ; код символу в DL
mov ah,2 ; номер функції DOS в АН
int 21h ; вивід символу
ret ; цей RET працює два рази - один раз
; для повернення з процедури print_nibble,
; викликаної для старшої цифри,
; і другий раз - для повернення з print_al
messagel db “Десяткове число: $"
message2 db “Шестнадцатеричное число: $"
err_msg db “Помилка введення”
crlf db 0Dh,0Ah,'$'
buffer db 6 ; максимальний розмір буфера введення
blength db ? ; розмір буфера після зчитування
bcontents: ; уміст буфера розташовується за
; кінцем Сома-файлу
Функція 0Ah надає зручний, але обмежений спосіб уведення даних. Найчастіше використовують функції посимвольного введення, що дозволяють контролювати відображення символів на екрані, реакцію програми на функціональні і керуючі клавіші і т. д.
Функція DOS 01h — Вважати символ з STDIN з луною, чеканням і перевіркою на Ctrl-Break
Уведення: |
АН = 01h |
Вивід: |
AL = ASCII-код символу або 0. Якщо AL = 0, другий виклик цієї функції поверне в AL розширений ASCII-код символу |
При читанні за допомогою цієї функції введений символ автоматично негайно відображається на екрані (посилається в пристрій STDOUT — так що його можна перенаправляти у файл). При натисканні Ctrl-C або Ctrl-Break виконується команда INT 23h. Якщо натиснуто клавішу, що не відповідає якому-небудь символові (стрілки, функціональні клавіші Ins, Del і т. д.), то в AL повертається 0 і функцію треба викликати ще один раз, щоб одержати розширений ASCII-код (див. додаток 1).
У трьох наступних варіантах цієї функції код символу повертається в AL по такому ж принципі.
Функція DOS 08h — Вважати символ з STDIN без луни, з чеканням і перевіркою на Ctrl-Break
Уведення: |
АН = 08h |
Вивід: |
AL = код символу |
Функція DOS 07h — Вважати символ з STDIN без луни, з чеканням і без перевірки на Ctrl-Break
Уведення: |
АН = 07h |
Вивід: |
AL = код символу |
Функція DOS 06h — Вважати символ з STDIN без луни, без чекання і без перевірки на Ctrl-Break
Уведення: |
АН = 07h DL = 0FFh |
Вивід: |
ZF = 1, якщо не була натиснута клавіша, і AL = 00 ZF = 0, якщо клавіша була натиснута. У цьому випадку AL = код символу |
Крім перерахованих функцій можуть знадобитися і деякі службові функції DOS для роботи з клавіатурою.
Функція DOS 0Bh — Перевірити стан клавіатури
Уведення: |
АН = 0Bh |
Вивід: |
AL = 0, якщо не була натиснута клавіша AL = 0FFh, якщо була натиснута клавіша |
Цю функцію зручно використовувати перед функціями 01, 07 і 08, щоб не чекати натискання клавіші. Крім того, виклик цієї функції дозволяє перевірити, не зчитуючи символ із клавіатури, чи була натиснута комбінація клавіш Ctrl-Break; якщо це відбулося, виконається переривання 23h.
Функція DOS 0Ch — Очистити буфер і вважати символ
Уведення: |
АН = 0Ch AL = Номер функції DOS (01, 06, 07, 08, 0Ah) |
Вивід: |
Залежить від викликаної функції |
Функція 0Ch очищає буфер клавіатури, так що наступна функція читання символу буде чекати введення з клавіатури, а не використовувати натиснутий раніше і ще не оброблений символ. Наприклад, саме ця функція використовується для зчитування відповіді на питання “ чиУпевнений користувач у тім, що він хоче отформатировать диск?”.
4. Завдання на лабораторну роботу.
Відкомпілювати та превірити роботу трьох прикладів.
5. Методичні вказівки з оформлення звіту
Звіт до лабораторної роботи повинен містити:
тему лабораторної роботи;
формулювання мети і задач, що вирішуються в ході виконання роботи;
докладний звіт про організацію введення та виведення даних;
Звіт про роботу наведених прикладів;
висновки.
6. Критерії оцінювання.
На 3 бали:
Вміти дати відповіді на питання для самоконтролю та самоперевірки. Виконати приклад 1
На 4 бали:
Виконати приклад 2
На 5 балів:
Виконати приклад 3
7. Питання для самоперевірки
Який спосіб передачі змінних використовується у прериваннях int21 та int16?
Чим відрізняється робота програм прикладу 1 та прикладу 2?
У чому проявляється складність із введенням з клавіатури значень зміних та виведенням на екран результатів?
Чим по своїй суті є преривання?
8. Література
1. Голуб Н. Г. Искусство программирования на Ассемблере. Лекции и упражнения.- СПб.: ООО”ДиаСофтЮП”, 2002. – 656 с.
2. Магда. Ю. С. M12 Ассемблер для процессоров Intel Pentium. – СПб.: Питер, 2006. – 410с.
3. Ирвин Кип. Язык ассемблера для процессоров Intel, 4-е издание.: Пер с англ. – М.: Издательский дом ”Вильямс”, 2005. – 912с.
ЗМІСТ
Лабораторна робота 1. 1
Лабораторна робота 2. 8
Лабораторна робота 3. 16
Лабораторна робота 4. 27
Лабораторна робота 5. 39
Лабораторна робота 6. 48
Лабораторна робота 7. 59
Лабораторна робота 8. 68
Лабораторна робота 9. 80
Лабораторна работа 10-11. 93