Читайте также:
|
|
1. Постановка задачі для конкретного варіанта.
2. Блок-схема алгоритму виконання прикладу з детальним коментарем та описом роботи.
3. Лістинг програми та коментарі до всіх команд.
4. Рrint screen екрана 32-розрядного налагоджувача з виконанням програми та результатами виконання.
5. Короткий опис виконання програми.
6. Висновки за результатами роботи.
Приклад 13.3. Задано матрицю 2 ´ 4. Визначити суму всіх негативних елементів матриці. Результат виконання програми вивести у вікно консолі.
Лістинг 13.6. Програма виконання прикладу 13.3:
title CopyRight by Rysovaniy A. N., rysov@rambler.ru
.386; директива визначення типу мікропроцесора
.model flat, stdcall; завдання лінійної моделі пам’яті та угоди ОС Windows
option casemap:none; відмінність малих та великих літер
include \masm32\include\windows.inc; файли структур, констант …
include \masm32\include\\user32.inc; файли інтерфейсу …
include \masm32\include\kernel32.inc; файли систем. функцій застосувань…
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
DATE1 STRUCT; тип даних СТРУКТУРА з іменем DATE1
elem1 dd?; ім’я першого поля структури
elem2 dd?; ім’я другого поля структури
elem3 dd?; ім’я третього поля структури
elem4 dd?; ім’я четвертого поля структури
DATE1 ENDS
.data; директива визначення даних
str1 DATE1 <1,-1,-2,3>; структура з іменем str1
str2 DATE1 <0,-2,-1,-3>; структура з іменем str2
titl1 db " Работа с элементами структуры",0
buf db 10 dup(?),0
ifmt db "Задана матрица:",0dh,0ah,\
"1 -1 -2 3",0dh,0ah,\
"0 -2 -1 -3",0dh,0ah,0ah,\
"Результат сложения отрицательных элементов",0dh,0ah,\
" = %d ",0dh,0ah,0ah,\
"Автор программы: НТУ ХПИ",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 buf, \; адреса буферу, куди буде записана послідовність символів
ADDR ifmt, edx; адреса рядка перетворення формату та регістр перетворення
invoke MessageBox, 0, addr buf, \; адреса рядка, яка містить текст повідомлення
addr titl1, MB_ICONINFORMATION+180000h; заголовок та вигляд вікна
invoke ExitProcess, 0; повернення керування ОС Windows та вивільнення ресурсів
end start; директива закінчення програми з іменем start
Результат виконання програми з лістингу 13.7 наведено на рис. 13.8.
У результаті виконання програми отримується число -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; відмінність малих та великих літер
include \masm32\include\windows.inc; файли структур, констант …
include \masm32\macros\macros.asm
uselib kernel32, fpu
mSubB macro _a,_b;; макрос з ім’ям mSubB для (a – b)
mov al,_a;; занесення змінної а
sub al,_b;; віднімання a – b
mov res1,al;; збереження результату у пам’яті
endm;; закінчення макросу
@ macro c0,c1,c2,c3;;макрос для запису команд в рядок
c0
c1
c2
c3
endm;; закінчення макросу @
.data; директива визначення даних
_a db 6; збереження в комірці пам’яті розміром в байт операнда 6
_b db 5; збереження в комірці пам’яті розміром в байт операнда 5
res1 db 0; резервування пам’яті для результату res1
buf dd?,0; буфер виведення повідомлення
ifmt db " Уравнение: ", 0dh,0ah,"Y = a(a – b) - (a – b)", 0dh,0ah,0ah,;
"При а = 6, b = 5, Y = %d",0dh,0ah,0ah, "Автор программы:",0;
titl db "Результат решения уравнения",0; назва спрощеного вікна
.code; директива початку програми
_start:; мітка початку програми з ім’ям _start
; виконання [a х mSubB]
@<mSubB [_a],[_b]>,<mov al,_a>,<mul res1>,<mov bx,ax>
; виконання [- mSubB]
@<mSubB [_a],[_b]>,<movzx ax,res1>,<sub bx,ax>,<movzx ebx,bx>
invoke wsprintf, ADDR buf,\; функція перетворення числа та адр. буф. з символами
ADDR ifmt, ebx; адреса рядка перетворення формату та регістр з результатом
invoke MessageBox, 0,addr buf,\; hwnd та адр. буфера текст повідомлення
addr titl, MB_ICONINFORMATION; адреса заголовку вікна та вигляд вікна
invoke ExitProcess, 0; повернення керування ОС Windows та визволення ресурсів
end _start; директива закінчення програми з іменем start
Для виведення чисел на екран за допомогою АРІ-функцій необхідно, щоб результат був розташований у 32-розрядному регістрі. Тому в програмі використано команду movzx, яка розширює результат до 32-розрядного формату. Результат виконання програми наведено на рис. 14.7.
Висновки: …
Література: Рисований О.М. Системне програмування [Текст]: підручник для студентів напрямку “Компютерна інженерія” вищих навчальних закладів. Видання друге: виправлено та доповнено – Х.: “Слово”, 2011. – 944 с.
Дата добавления: 2014-12-18; просмотров: 28 | Поможем написать вашу работу | Нарушение авторских прав |