Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра ЕОМ
Звіт
до лабораторної роботи № 1
з дисципліни: «Системне програмування»
на тему:
«Ознайомлення з середовищем MASM32. Структура програми на асемблері. Програмування вводу та виводу.»
Мета: освоїти послідовність дій для компіляції програм, написаних на мові Assembler за допомогою cсередовищ MASM32 і Visual Studio 2019. Навчитися реалізовувати ввід з клавіатури та вивід на екран символьних даних.
Теоретичні відомості
Програма мовою асемблера має таку структуру:
.686
.model flat, stdcall
option casemap: none
.data <ініціалізовані дані>
.data? <неініціалізовані дані>
.const <константи>
.code <мітка> <код>
end <мітка>
Директива .686 вказує компілятору асемблера, що необхідно використовувати набір операцій процесора певного покоління.
Директива .model дозволяє вказувати модель пам'яті та угоду про виклики. Архітектура Win32 використовує лише одну модель пам'яті – flat, що й зазначено у наведеному прикладі. Угоди про виклики визначають порядок передачі параметрів та порядок очищення стека.
Директива option casemap: none змушує компілятор мови асемблера розрізняти великі та маленькі літери у мітках та іменах процедур.
Директиви .data, .data?, .const та .code визначають те, що називається секціями. У Win32 немає сегментів, але адресний простір можна розділити на логічні секції. Початок однієї секції відзначає кінець попередньої. Є дві групи секцій: даних та коду.
Секція .data містить ініціалізовані дані програми.
Секція .data? містить неініціалізовані дані програми. Іноді потрібно лише попередньо виділити пам'ять, не ініціалізуючи її. Ця секція при цьому і призначається. Перевага неініціалізованих даних у тому, що вони не займають місця у файлі. Ви лише повідомляєте компілятору, скільки місця вам знадобиться, коли програма завантажиться в пам'ять.
Секція .const містить оголошення констант, що використовуються програмою. Константи не можуть бути змінені. Спроба змінити константу викликає аварійне завершення програми.
Задіяти усі три секції не обов'язково.
Є лише одна секція для коду: .code. У ньому міститься весь код.
<мітка> та end <мітка> встановлюють межі коду. Обидві мітки мають бути ідентичними. Весь код повинен розташовуватись між цими рядками. Будь-яка програма під Windows має, як мінімум, коректно завершитись. Для цього потрібно викликати функцію Win32 API ExitProcess.
ЗАВДАННЯ:
1. За допомогою текстового редактора створити файл <прізвище>.asm , який містить програму, приведену нижче. (Параметр <прізвище> повинен містити Ваше прізвище в англійській транслітерації і мати довжину до 8 символів).
2. В тексті програми змінити повідомлення, що міститься за міткою HelloMessage так, щоб воно відображало Ваше прізвище. Зберегти внесені зміни.
3. Створити <прізвище>.exe-файл засобами системи MASM32 або Visual Studio 2019.
4. Виконати створену програму і переконатися, що вона працює коректно, тобто виводить Ваше прізвище на екран.
.686
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
hConsoleOutput dd 0
NumberOfCharsWritten dd 0
HelloMessage db 'Hello, world', 10, 13
NumberOfCharsToWrite dd $-HelloMessage
.code
start:
push -11
call GetStdHandle
mov hConsoleOutput, eax
push 0
push offset NumberOfCharsWritten
push NumberOfCharsToWrite
push offset HelloMessage
push hConsoleOutput
call WriteConsoleA
push 0
call ExitProcess
end start
5. Створити програму, яка в текстовому режимі виводить за допомогою псевдографіки зображення заданого варіантом символу.
6. Перевірити роботу створеної програми і продемонструвати її виконання.
7. Скласти звіт про виконану роботу (з приведенням тексту програми).
Виконання роботи
1-4 Завдання:
Код програми:
.686
.model flat, stdcall
option casemap:none
GetStdHandle proto STDCALL, nStdHandle : DWORD
WriteConsoleA proto STDCALL, hConsoleOutput : DWORD, lpBuffert : DWORD, nNumberOfCharsToWrite : DWORD, lpNumberOfCharsWritten : DWORD, lpReserved : DWORD
ExitProcess proto STDCALL, uExitCode : DWORD
.data
hConsoleOutput dd 0
NumberOfCharsWritten dd 0
HelloMessage db ‘Bokhonok',10, 13
NumberOfCharsToWrite dd $-HelloMessage
.code
start:
push -11
call GetStdHandle
mov hConsoleOutput, eax
push 0
push offset NumberOfCharsWritten
push NumberOfCharsToWrite
push offset HelloMessage
push hConsoleOutput
call WriteConsoleA
push 0
call ExitProcess
end start
Результат виконання програми:
/
5-6 Завдання:
Код програми:
.686
.model flat, stdcall
option casemap:none
AllocConsole proto STDCALL
GetStdHandle proto STDCALL, nStdHandle : DWORD
WriteConsoleA proto STDCALL, hConsoleOutput : DWORD, lpBuffert : DWORD, nNumberOfCharsToWrite : DWORD, lpNumberOfCharsWritten : DWORD, lpReserved : DWORD
ExitProcess proto STDCALL, uExitCode : DWORD
ReadConsoleA proto STDCALL, hConsoleInput : DWORD, lpBuffer : DWORD, nNumberOfCharsToRead : DWORD, lpNumberOfCharsRead : DWORD, pInputControl : DWORD
.data
hConsoleOutput dd 0
NumberOfCharsWritten dd 0
Symbol db 60 dup (32),10,13
db 9 dup (32),2 dup(219),8 dup(32),2 dup(219), 10, 13
db 9 dup (32),2 dup(219),8 dup(32),2 dup(219), 10, 13
db 9 dup (32),2 dup(219),8 dup(32),2 dup(219), 10,13
db 9 dup (32),10 dup(219),0 dup(32),2 dup(219), 10,13
db 9 dup (32),2 dup(219),8 dup(32),2 dup(219), 10,13
db 9 dup (32),2 dup(219),8 dup(32),2 dup(219), 10,13
db 9 dup (32),2 dup(219),8 dup(32),2 dup(219), 10, 13
NumberOfCharsToWrite dd $-Symbol
ReadBuf db 128 dup(?)
hConsoleInput dd 0
.code
start:
call AllocConsole
push -11
call GetStdHandle
mov hConsoleOutput, eax
push 0
push offset NumberOfCharsWritten
push NumberOfCharsToWrite
push offset Symbol
push hConsoleOutput
call WriteConsoleA
push -10
call GetStdHandle
mov hConsoleInput, eax
push 0
push offset NumberOfCharsWritten
push 128
push offset ReadBuf
push hConsoleInput
call ReadConsoleA
push 0
call ExitProcess
end start
Результат виконання програми:
Висновок: на даній лабораторній роботі я освоїла послідовність дій для компіляції програм, написаних на мові Assembler за допомогою cсередовищ MASM32 і Visual Studio 2019. Навчилася реалізовувати ввід з клавіатури та вивід на екран символьних даних.