Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб2012 / ЛР8 Структури та макроси

.doc
Скачиваний:
22
Добавлен:
02.02.2015
Размер:
88.58 Кб
Скачать

СП12 ЛР8 «Дослідження програм з використанням структур та макросів»,

НТУ ХПИ, КИТ-11а, Иванов И.И.

Лабораторна робота №8. “Структури та макроси”

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

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

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

Структури”

Постановка задачі

Згідно з останньою цифрою номера студента в групі вибрати свій варіант завдання та написати на асемблері програму обчислення одного з виразів з виведенням свого завдання, отриманих даних та довідку про автора програми функцією MessageBoxIndirect з відображенням своєї фотографії в якості іконки.

Завдання 1

1. Задано матрицю 3  5. Виконати транспонування цієї матриці. Результат виконання програми вивести у вікно консолі.

2. Задано матрицю 6  6. Визначити суму елементів під головною діагоналлю. Результат виконання програми вивести у вікно консолі.

3. Задано матрицю 3  4. Визначити рядок з максимальною сумою позитивних елементів. Результат виконання програми вивести у вікно консолі.

4. Задано матрицю 4  5. Визначити мінімальний елемент кожного стовпця. Результат виконання програми вивести у вікно консолі.

5. Задано матрицю 5  7. Визначити максимальний елемент кожного парного рядка. Результат виконання програми вивести у вікно консолі.

6. Задано матрицю 4  6. Визначити суму елементів кожного стовпця. Результат виконання програми вивести у вікно консолі.

7. Задано матрицю 3  6. Визначити рядок з максимальною сумою елементів. Результат виконання програми вивести у вікно консолі.

8. Задано матрицю 3  5. Визначити рядок з мінімальною сумою елементів. Результат виконання програми вивести у вікно консолі.

9. Задано матрицю 3  6. Визначити елементи, кратні 3, в кожному рядку і помістити на їх місце елемента, номер якого збігається з номером рядка. Результат виконання програми вивести у вікно консолі.

10. Задано матрицю 4  6. Визначити суму негативних елементів кожного рядка і помістити її на місце першого елемента. Результат виконання програми вивести у вікно консолі.

Завдання 2

1. Задано послідовність структур. Структура містить поля: назва автомобіля, порядковий номер, ім’я власника, кількість порушень. Обчислити кількість власників з більш ніж з трьома порушеннями.

2. Задано послідовність структур. Структура містить поля: ім’я студента, стипендія, середня оцінка, вік. Обчислити середній вік студентів.

3. Задано послідовність структур. Структура містить поля по кредитній картці: номер, прізвище власника, розмір грошової суми ступінь захисту. Обчислити кількість кредитних карток з грошовою сумою більше $300 і ступенем захисту більше 10.

4. Задано послідовність структур. Структура містить поля (відповідно до комп’ютера): серійний номер, ціна, назва, прізвище власника, розмір монітора в дюймах. Обчислити середню ціну 26-дюймових моніторів.

5. Задано послідовність структур. Структура містить поля за характеристиками студентських груп: назва групи, успішність (середня цілочисельна оцінка), номер курсу. Вивести на екран назву групи з максимальною успішністю.

6. Задано послідовність структур. Структура містить поля по торговій діяльності комп’ютерної фірми: назва товару (комп’ютер, модем, гвинт), ціна (у доларах), кількість проданих одиниць. Обчислити прибуток фірми (підсумовування “кількості проданих одиниць помножену на ціну”).

7. Задано послідовність структур. Структура містить поля по торговій діяльності комп’ютерної фірми: назва товару (комп’ютер, модем, гвинт), ціна (у доларах), кількість проданих одиниць. Обчислити прибуток по кожному товару (прибуток = кількість проданих одиниць, помножена на ціну).

8. Задано послідовність структур. Структура містить поля по зарплаті викладачів: прізвище викладача, назва курсу (який веде викладач), посада, зарплата. Обчислити прізвище самого низькооплачуваного викладача.

9. Задано послідовність структур. Структура містить поля по даних податкової інспекції: назва фірми, прибуток, розмір оплачуваних податків, кількість штрафів. Обчислити кількість фірм, дохід яких перевищує середній дохід фірм.

10. Задано послідовність структур. Структура містить поля: назва автомобіля, порядковий номер, ім’я власника, кількість порушень. Вивести на екран ім’я власника з максимальним числом порушень.

11. Задано послідовність структур. Структура містить поля: назва автомобіля, порядковий номер, ім’я власника, кількість порушень. Вивести на екран ім’я власника з мінімальним числом порушень.

12. Задано послідовність структур. Структура містить поля: ім’я студента, стипендія, середня оцінка, вік. Обчислити середню оцінку студентів.

13. Задано послідовність структур. Структура містить поля: назва автомобіля, порядковий номер, ціна автомобіля, рік випуску, розмір податків. Обчислити кількість автомобілів з останнім (максимальним) роком випуску.

14. Задано послідовність структур. Структура містить поля по комп’ютеру: серійний номер, ціна, назва, прізвище власника, розмір монітора в дюймах. Обчислити середню ціну комп’ютера.

15. Задано послідовність структур. Структура містить поля по характеристиці студентських груп: назва групи, успішність (середня цілочисельна оцінка), номер курсу. Вивести на екран назву групи з мінімальною успішністю.

16. Задано послідовність структур. Структура містить поля по торговій діяльності комп’ютерної фірми: назва товару (комп’ютер, модем, гвинт), ціна (у доларах), кількість проданих одиниць. Обчислити загальну кількість проданих одиниць.

17. Задано послідовність структур. Структура містить поля по зарплаті викладачів: прізвище викладача, назва курсу (який веде викладач), посада, зарплата, адреса. Вивести на екран адресу максимально оплачуваного викладача.

18. Задано послідовність структур. Структура містить поля по зарплаті викладачів: прізвище викладача, назва курсу (який веде викладач), посада, зарплата, адреса. Обчислити середню, мінімальну і максимальну зарплату викладачів.

19. Задано послідовність структур. Структура містить поля по даних податкової інспекції: назва фірми, прибуток, розмір оплачуваних податків, кількість штрафів. Вивести на екран назву фірми з максимальною кількістю штрафів.

20. Задано послідовність структур. Структура містить поля по даних податкової інспекції: назва фірми, прибуток, розмір оплачуваних податків, кількість штрафів. Вивести на екран назву фірми з максимальним прибутком.

Макроси.

Постановка задачі

Згідно з останньою цифрою номера студента в групі вибрати свій варіант та написати на асемблері програму обчислення одного з виразів з використанням макросів та виведенням їх на екран. При цьому обов’язково використати як консоль, так й спрощені віконця з повідомленнями: в одному віконці вивести своє прізвище, номер своєї навчальної групи та своїх фотографії в якості іконки; при натисканні на другу кнопку спрощеного віконця – вивести умову завдання. Використання інших кнопок спрощеного віконця виведення повідомлень – за бажанням.

Завдання 1

1. (2a/b) + a/3,1b; 6. (1,1ab – 3)/ab;

2. 1,1(x – a) + 210/(x – a); 7. 2,3(a – b) + 2,3(a – b)/a;

3. x + a – 4,5/(x + a); 8. 5,6(ab + d)/[5,6(ab – d)];

4. 3,5(ab) – (a – b)/5,1; 9. (de – e)/[2,2(de – e)];

5. 2x – 3,3 + 8,5(2x –3,3); 10. (a/2,3b) – (2,3a/b).

Завдання 2. Самостійно придумати завдання та написати програму з обов’язковим використанням макросів masm32 за варіантом згідно з останньою цифрою номера студента в групі. Використання інших макросів – за бажанням.

1. Макроси запитів.

2. Макроси файлового введення-виведення.

3. Макроси розміщення пам’яті.

4. Консольні макроси.

5. Макроси рядкових команд.

6. Макроси динамічних рядкових масивів.

7. Макроси шляхів та директорій.

8. Макроси розподілення пам’яті.

9. Макроси бібліотек.

10. Макроси перетворення.

Зміст звіту

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 с.

4

Соседние файлы в папке Лаб2012