.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. Дані, які виводяться необхідно підписати. Окремо вивести довідку про автора програми.