- •Лабораторна робота 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.1. Реалізація основних операцій по обробці масивів мовою асемблера.
3.1.1. Оголошення масиву. Для оголошення масиву в секції визначення даних досить оголосити змінну і тип даних:
- масив з десяти 32-бітних даних: array dd 10 dup (?)
3.1.2. Ініціалізація масиву:
масив з десяти 32-бітних даних: array1 dd 1,2,5,4,5,6,7,8,9,10:
масив з десяти 16-бітних даних: array2 dw 5 dup (4095) - створюється масив з 10 елементів, значенням яких є число 4095(0FFFh):
З погляду програмування на асемблері не існує принципових відмінностей в оголошенні одномірних і двовимірних масивів, так приведений вище приклад оголошення масиву array1, можна розглядати як двовимірний масив (2x5) або (5x2):
а) array |
[1 |
2 |
б) array |
[1 |
2 |
3 |
4 |
5 |
3 |
4 |
6 |
7 |
8 |
9 |
10] |
||
5 |
6 |
|
|
|
|
|
||
7 |
8 |
|
|
|
|
|
||
9 |
10] |
|
|
|
|
|
Розходження будуть виявлятися тільки при організації доступу до елемента масиву.
3.1.3. Організація доступу до елементів масиву. Для одержання доступу до елемента масиву при програмуванні на асемблері використовується непряма адресація операндів, при цьому в якості перемінної - лічильника зручно використовувати один з вільних регістрів загального призначення.
- доступ до елементів одномірного масиву:
Рис.1.- Алгоритм доступу до елемента одномірного масиву
Приклад коду, що реалізує алгоритм, наведений на рисунку 1.
|
mov есх,10 |
; в <есх> кількість елементів |
|
mov ebx, array |
; в <ebx> адреса вектору (масиву) |
|
mov edi, 0 |
; лічильник елементів вектора |
@@1: |
mov еах, [ebx+edi] |
; доступ до елементу вектора |
|
add edi, 4 |
; наступний елемент вектора |
|
loopnz @@1 |
; цикл |
- для доступу до елементів двовимірного масиву необхідно в якості індексних використовувати 2 регістри, наприклад ebx і esi, алгоритм приведений на рисунку 2, приклад коду - нижче:
|
xor ebx, ebx |
; зсув <ebx>=0 - по рядках |
|
mov ecx,[m] |
; число рядків в <есх> |
|
jcxz @@3 |
; перевірка коректності даних (m=0?) |
|
push есх |
; зберегти лічильник зовніш. циклу |
@@1: |
|
; цикл по рядках (зовнішній) |
|
xor esi, esi |
; зсув <esi>=0 - по стовпцях |
|
mov ecx,[n] |
; число стовпчиків в <есх> |
|
jcxz @@3 |
; n=0?, якщо – „так”, то вихід. |
@@2: |
|
; цикл по стовпцях (внутрішній) |
|
mov eax, [array+ebx+esi] |
; обробка даних |
|
add esi, 2 |
; +2(dw), +1(db) – наступний елемент |
|
loop @@2 |
; внутрішній цикл |
|
add ebx,[NN] |
; перехід на наступний рядок |
|
|
; NN=2(dw)*n - число елем. рядка |
|
pop есх |
; відновити лічильник зовніш. циклу |
|
loop @@1 |
; зовнішній цикл |
@@3: |
|
|
|
|
; вихід |
Рис.2. – Організація доступу до елементів двовимірного масиву
3.1.4. Обробка масиву.
- без використання ланцюжкових команд. У даному випадку використовуються всі команди (пересилання, арифметичної, бітові, передачі управління).
Приклад 1: знайти індекси максимального і мінімального елементів масиву, що складається з елементів розміром байт. Нумерація елементів масиву з одиниці.
Вирішимо цю задачу без використання циклічних команд. Змінні IndMax і IndMin, будемо використовувати для збереження чергового локального елемента.
З огляду на, що для елементів розміром у байт діапазон значень дорівнює -128...+127, максимальне значення приймемо рівним -128, а мінімальне +127. Відповідна програма на асемблері приведена нижче.
|
format pe |
|
|
jmp start |
|
|
N dw10 |
; розмірність масиву. |
|
A db -3, 5, 2, 6, 11, 5, -4, 127, -9, 10 |
|
|
IndMax dw? |
; індекс максимального елемента |
|
IndMin dw? |
; індекс мінімального елемента |
start: |
|
|
|
xor esi, esi |
; лічильник циклу. |
|
mov ch, -128 |
; макс, значення масиву. |
|
mov cl, 127 |
; мінім. значення масиву. |
Ml: |
mov al, byte [A+esi] |
; flat model - 32 розрядна адреса!!! |
|
cmp al, ch |
; пошук максимуму |
|
jle M2 |
|
|
mov ch, al |
; поточний елемент більше максимуму. |
|
mov [IndMax], si |
; запам'ятовуємо його номер |
|
inc [IndMax] |
; корегування номера, тому що esi=i-l. |
M2: |
cmp al, cl |
; пошук мінімуму. |
|
jge МЗ |
|
|
mov cl, al |
; поточний елемент менше мінімуму. |
|
mov [IndMin], si |
; запам'ятовуємо його номер |
|
inc [IndMin] |
; корегування номера, тому що esi=i-l. |
МЗ: |
inc esi |
; команди завершення тіла циклу. |
|
cmp esi, 10 |
|
|
jb Ml |
|
|
ret |
|
Приклад 2: знайти входження елементу у двомірний масив.
...
- із використанням ланцюжкових команд. Відомо, що ланцюжкові команди дозволяють досить легко бути пристосовані для обробки масивів. При використанні ланцюжкових команд завжди варто пам'ятати про регістри, використовуваних за замовчуванням - edi і esi, - саме з їхньою допомогою й організується програма обчислень.
Приклад 2. Знайти елементи масиву менші визначеного числа n замінити їх заданим значенням
|
format pe |
|
start: |
|
|
|
mov ecx, [len] |
; розмір масиву -> есх |
|
mov edi, array |
; адреса першого елемента -> edi |
|
mov eax, 5 |
; значення для порівняння |
|
cld |
; установити прапор напрямку убік |
|
|
; збільшення адрес |
next: |
|
|
|
scasd |
; порівнюємо елемент з вмістом <еах> |
|
jg change |
; число в еах більше поточного елемента? |
|
loop next |
; якщо ні, наступна ітерація |
|
jmp exit |
|
change: |
|
; елемент масиву менше числа в еах |
|
mov ebx, [edi-4] |
|
|
mov dword [edi-4], 0 |
; замінити вміст комірки пам'яті на 0 |
|
dec ecx |
; декремент лічильника |
|
jmp next |
|
exit: |
|
|
|
ret |
|
|
len dd 10 |
|
|
array dd 1,2,5,4,5,6,7,8,9,10 |
|
|
_ar dw 10 dup (3) |
|