Зміст звіту

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

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

3. Лістинг програми з детальним коментарем та описом роботи.

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

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

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

Приклад 10.15. Обчислити 3 значення функції Yn = 5х2/1,1 (x змінюється від 1 з кроком 1). Результат розмістити в пам’яті та вивести на екран.

Алгоритм вирішення прикладу 10.15 наведено на рис. 10.23.

 
 

 

 


У зв’язку з тим, що необхідно вивести три числа, для розділу комірок використовується додатковий елемент (регістр EDX). Спочатку цей регістр дорівнює нулю. Співпроцесор записую в пам’ять 80-розрядні числа (десять байтів). Тому в циклі виконується команда

add edx,0Ah

для виконання зміщення відносно попередньої комірки, яка потім буде адресуватися як res[edx].

У прикладі при отриманні х2 використовуються цілі числа. Тому необхідно виконати команду

fild dword ptr resEAX.

Якщо виконати команду fld … , то в даному випадку результат буде з похибкою.

А оскільки АРІ-функції при своєму виконанні змінюють регістри, то значення тих регістрів, які потрібні при виконанні програми, необхідно зберігати (найкраще – в стеку).

Лістинг 10.18. Програма виконання прикладу 10.15:

title CopyRight by Rysovaniy A. N. Обчислення Yn = 5х2 / 1,1

.686 ; директива визначення типу мікропроцесора

.model flat,stdcall ; завдання лінійної моделі пам’яті

; та угоди ОС Windows

option casemap:none ; відмінність малих та великих літер

include masm32includewindows.inc

include masm32includekernel32.inc

include masm32includefpu.inc

includelib masm32libuser32.lib

includelib masm32libkernel32.lib

includelib masm32libfpu.lib

BSIZE equ 30 ; розмір буфера

.data ; директива визначення даних

const1 DWORD 1.1 ; визначення в 32-розрядній комірці числа 1.1

const2 DWORD 5.0 ; визначення в 32-розрядній комірці числа 5.0

resEAX DWORD 0 ; 32-розрядна комірка для тимчасового результату

res TBYTE 3 dup (0) ; три 80-розрядні комірки для результатів

stdout DWORD ? ; резервування в пам’яті 32-розрядної комірки

; з ім’ям stdout для збереження дескриптора виведення

cWritten DWORD ? ; резервування 32-розрядної комірки пам’яті

; з ім’ям cWritten для адреси символів виведення

buf BYTE BSIZE dup (?) ; кількість байтів для запису послідовності символів

.code ; директива початку коду програми

_st: ; мітка початку програми

xor edx,edx ; початкове значення (для зміщення)

mov ecx,3 ; лічильник циклів

mov ebx,1 ; початкове значення х

m1: mov eax,ebx ; підготування до піднесення в степінь

mul ebx ; піднесення в степінь

mov resEAX,eax ; збереження х2 в пам’яті

finit ; ініціювання співпроцесора

fld dword ptr const1 ; st(0) := 1.1

fld dword ptr const2 ; st(0) := 5.0, st(1) := 1.1

fild dword ptr resEAX ; st(0) := resEAX, st(1) := 5.0, st(2) := 1.1

fmul st,st(1) ; st(0) := resEAX x 5.0

fdiv st,st(2) ; st(0) := st(0)/st(2)

fstp res[edx] ; збереження результату в комірці res[edx]

push ecx ; підготовка до виклику АРІ-функції

push edx ; підготовка до виклику АРІ-функції

invoke GetStdHandle, STD_OUTPUT_HANDLE ; отримання дескриптора

mov stdout, eax ; збереження одержаного дескриптора у пам’яті

invoke FpuFLtoA, ; функція перетворення 80-розрядного числа

ADDR res[edx], ; адреса числа, що відображається

10, ; кількість десяткових знаків після коми (10)

ADDR buf, ; адреса буфера для символів, які перетворяться

SRC1_REAL or SRC2_DIMM ; операанд SRC1в пам’яті

; операнд SRC2 з параметром DIMM

invoke WriteConsoleA, ; АРІ-функція виведення на екран

stdout, ; дескриптор стандартного пристрою виведення

ADDR buf, ; адреса початку повідомлення

BSIZE, ; розмір повідомлення

ADDR cWritten, ; адреса, де зберігається число символів

pop edx ; встановлення edx

add edx,0Ah ; підготовка до вибору наступної комірки

inc ebx ; збільшення х

pop ecx ; встановлення есх

loop m1 ; перейти, якщо не нуль

invoke ExitProcess, 0 ; повернення керування ОС Windows

; та визволення ресурсів

end _st ; директива закінчення програми

На рис. 10.24 наведено результат виконання лістингу 10.18.

 
 

 


11.2. Лабораторна робота “Рядки”

 

Мета заняття:

– поглибити і закріпити знання з архітектури МП платформи х86 і навички його програмування;

– придбати практичні навички складання, налагодження і виконання програм, написаних мовою асемблеру з використанням команд обробки рядків та АРІ-функцій під Win32 для програмування МП платформи х86.