DATE1 ENDS

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

str1 DATE1 <1,-1,-2,3> ; структура з іменем str1

str2 DATE1 <0,-2,-1,-3> ; структура з іменем str2

st1 db " amount of negative elements ",0

st2 db 10 dup(?),0

ifmt db "%d",0

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

start: ; мітка початку програми з ім’ям start

xor edx,edx ; заповнювання нулями

mov ebx,2 ; завантаження кількості рядків

lea esi,str1 ; завантаження адреси першого рядка структури

m5: mov ecx,4 ; кількість елементів у рядку

m3: mov eax,[esi] ; завантаження елемента з рядка структури

add eax,0 ; визначення ознак елемента

js m1 ; перейти на m1, якщо елемент негативний

jmp m2 ; безумовний перехід, якщо навпаки

m1: add edx,eax ; додавання негативних елементів рядка структури

m2: add esi,4 ; підготовка адреси нового елемента

loop m3 ; есх := ecx – 1 та перехід на m3, якщо не нуль

dec ebx ; ebx := ebx – 1

jz m4 ; якщо ebx = 0 (z = 1), то перехід на закінчення

lea esi,str2 ; завантаження адреси нового рядка

jmp m5 ; перехід на новий цикл

m4:

invoke wsprintf, ; АРІ-функція перетворення числа

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

ADDR ifmt, ; адреса рядка перетворення формату

edx ; регістр, вміст якого перетворюється

invoke MessageBox, ; АРІ-функція виведення вікна консолі

NULL, ; hwnd – ідентифікатор вікна

addr st2, ; адреса рядка, яка містить текст повідомлення

addr st1, ; адреса рядка, яка містить заголовок повідомлення

MB_OK ; вигляд діалогового вікна

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

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

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

 

Результат виконання програми з лістингу 13.7 наведено на рис. 13.6.

 

 

У результаті виконання програми отримується число -9, яке заноситься до регістра edx, а потім виводиться у вікно консолі.

 

Приклад 14.5.Написати програму з використанням макросів для обчислення виразу

a(a – b) – (a – b)

та слів розміром у байт.

 

Програму без виведення результату на монітор наведено в лістингу 14.6.

Лістинг 14.6:

title CopyRight by Rysovaniy A. N. RYSOV@RAMBLER.RU

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

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

; та угоди ОС Windows

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

includelib masm32libkernel32.lib

ExitProcess proto:dword ; прототип API-функції

mSubB macro a,b ; макрос з ім’ям mSubB

mov al,a ;; занесення змінної а

sub al,b ;; віднімання a – b

mov res1,al ;; збереження результату у пам’яті

endm ;; закінчення макросу

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

a db 6 ; збереження в комірці пам’яті розміром в байт операнда 6

b db 5 ; збереження в комірці пам’яті розміром в байт операнда 5

res1 db 0 ; резервування пам’яті для результату res1

res2 dw 0 ; резервування пам’яті для результату res2

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

_start: ; мітка початку програми з ім’ям _start

mSubB [a],[b] ; виклик макросу

mov al,a

mov bl,res1

mul bl ; ax := al × bl

mov bx,ax ; визволення ах для наступних операцій

mSubB [a],[b] ; виклик макросу

movzx ax,res1 ; занесення з розширенням розрядності

sub bx,ax ;

mov res2,bx ; збереження залишкового результату

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

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

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

 

Стан програми лістингу 14.6 після її виконання наведено на рис. 14.6. У програмі макрос викликається два рази.

 

 
 

 

 


15.4. Лабораторна робота “Dll-файли”

 

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

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

– придбати практичні навички складання, налагодження і виконання програм з використанням Dll-файлів з використанням точки входу, написаних мовою асемблеру для програмування МП платформи х86. Дані, які виводяться необхідно підписати. Окремо вивести довідку про автора програми.