Зміст звіту

1. Постановка задачі для отриманого варіанта завдаання.

2. Блок-схема алгоритму виконання прикладу з детальним коментарем та описом роботи.

3. Лістинг програм: головної та зовнішньої процедури з детальним коментарем та описом роботи.

4. Рrint screen екрана 32-розрядного налагоджувача з виконанням програми та результатами виконання виразу.

5. Короткий опис виконання програми.

6. Висновки за результатами роботи.

Приклад 7.9.Хай потрібно обчислити вираз abc/d , де а, b, с, d – цілі числа розміром у подвійне слово.

Обчислення виконаємо за допомогою однієї процедури, яка розташована у файлі 9_14_1L.asm, що обчислює abcd. В головній програмі виконується тільки виклик зовнішньої процедури.

Складемо схему виконання прикладу (рис. 7.14).

 

 

 
 


Дробова частина результату запам’ятовується у комірці пам’яті з ім’ям res[0], а щодо цілої частини, то старша – у комірці res[8], а молодша – у res[4].

Згідно зі схемою складемо головну та додаткову програми. Головну програму з іменем 9_14L.asm наведено у лістингу 7.25.

Лістинг 7.25. Головна програма обчислення виразу abc/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. Всі інші команди наведено у іншому файлі, який містить процедуру обчислення виразу abc/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 у вікнах налагоджувача.