1. Постановка задачі для отриманого варіанта завдаання.
2. Блок-схема алгоритму виконання прикладу з детальним коментарем та описом роботи.
3. Лістинг програм: головної та зовнішньої процедури з детальним коментарем та описом роботи.
4. Рrint screen екрана 32-розрядного налагоджувача з виконанням програми та результатами виконання виразу.
5. Короткий опис виконання програми.
6. Висновки за результатами роботи.
Приклад 7.9.Хай потрібно обчислити вираз ab – c/d , де а, b, с, d – цілі числа розміром у подвійне слово.
Обчислення виконаємо за допомогою однієї процедури, яка розташована у файлі 9_14_1L.asm, що обчислює ab – cd. В головній програмі виконується тільки виклик зовнішньої процедури.
Складемо схему виконання прикладу (рис. 7.14).
Дробова частина результату запам’ятовується у комірці пам’яті з ім’ям res[0], а щодо цілої частини, то старша – у комірці res[8], а молодша – у res[4].
Згідно зі схемою складемо головну та додаткову програми. Головну програму з іменем 9_14L.asm наведено у лістингу 7.25.
Лістинг 7.25. Головна програма обчислення виразу ab – c/d.
title CopyRight by Rysovaniy A. N.
.386 ; директива визначення типу мікропроцесора
.model flat ; завдання лінійної моделі пам’яті
Extern _abcd:proc ; указання на зовнішню процедуру
Public _a, _b,_c, _d, _res ; доступ для інших модулів
.data ; директива визначення даних (ab – c/d)
_a dd 0FFFFFFFFh ; запис у 32-розрядну комірку з ім’ям _а
_b dd 0FFFFFFFFh ; 4294967295
_c dd 0FFFFFFFFh ; запис у 32-розрядну комірку з ім’ям _с
_d dd 0FFFFFFFh ; запис у 32-розрядну комірку з ім’ям _d
_res dd 3 dup(0) ; комірки для збереження результату
.code ; директива початку програми
_start: ; мітка початку програми з ім’ям _start
call _abcd ; виклик процедури
ret ; повернення керування ОС
end _start ; директива закінчення програми з ім’ям _start
Як команда асемблеру програма з лістингу 7.25 складається з однієї команди call _abcd. Всі інші команди наведено у іншому файлі, який містить процедуру обчислення виразу ab – c/d (лістинг 7.26).
Лістинг 7.26. Текст процедури з іменем _abcd:
title CopyRight by Rysovaniy A. N.
.386 ; директива визначення типу мікропроцесора
.model flat ; завдання лінійної моделі пам’яті
public _abcd
extern _a:dword, _b:dword, _c:dword,_d:dword,_res:dword
.code ; директива початку програми
_abcd proc ; ab - c/d
mov eax,_a ; пересилання з комірки пам’яті з ім’ям _а в eax
mov ebx,_b ; пересилання з комірки пам’яті з ім’ям _b в ebx
mul ebx ; edx, eax := eax × ebx
mov esi,eax
mov edi,edx
mov eax,_c
mov ebx,_d
xor edx,edx ; підготування до ділення
div ebx
mov ecx,0
sub ecx,edx ; віднімання дробової частині з цілого числа
mov _res[0],ecx ; запам’ятання дробової частини у пам’яті
sbb esi,eax ; віднімання цілої молодшої частини
mov _res[4],esi ; запам’ятовування молодшої цілої частини у пам’яті
sbb edi,0 ; віднімання позики, якщо вона є
mov _res[8],edi ; запам’ятовування старшої цілої частини у пам’яті
ret
_abcd endp
end ; директива закінчення програми
При написанні програми слід звернути увагу на команду ділення, яка потребує перед її виконанням ініціювати (обнулити) регістр EDX. Якщо цього не зробити, то незважаючи на те, що буде створено exe-файл, при покроковому виконанні здійсниться зависання програми.
Результатом виконання програми, розташованої у двох файлах, є число FFFF FFFD FFFF FFF0,FFFF FFF1h, яке можна побачити на рис. 7.15 у вікнах налагоджувача.