365.56K
Category: programmingprogramming

Листинг 2. Лабораторная работа №1

1.

ЛАБ_1.
Листинг 2

2.

Выполните Лабораторную
работу №1, листинге 2
приведен исходный текст
программы. Наберите код
программы в редакторе и
сохраните ее под именем
lab_1.2.asm в C:\WORK
.386
.model flat,stdcall
option casemap:none
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib
.data
stdout dd ?
msg db "Hello, world!",0dh,0ah
cWritten dd ?
.code
start:
invoke GetStdHandle, -11
mov stdout,eax
invoke WriteConsoleA, stdout, ADDR msg,\
sizeof msg, ADDR cWritten, 0
invoke ExitProcess, 0
end start

3.

Разбор кода
.386
.model flat,stdcall
option casemap:none
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib
.data
stdout dd ?
msg db "Hello, world!",0dh,0ah
cWritten dd ?
.code
start:
invoke GetStdHandle, -11
mov stdout,eax
invoke WriteConsoleA, stdout, ADDR msg,\
sizeof msg, ADDR cWritten, 0
invoke ExitProcess, 0
end start
Данный код на ассемблере x86 выводит на
консоль строку "Hello, world!" с помощью
функции WriteConsoleA.
Первые строки задают архитектуру
процессора, модель памяти и другие
настройки сборки программы. Затем
подключаются заголовочный файл
“kernel32.inc” и библиотека “kernel32.lib”,
содержащие функции операционной
системы Windows для работы с консолью и
другими ресурсами.
Символ \ можно использовать для
переноса строки

4.

Разбор кода
.data
stdout dd ?
msg db "Hello, world!",0dh,0ah
cWritten dd ?
Далее объявляется область данных (.data) и определяются переменные: stdout для дескриптора
стандартного вывода консоли, “stdout dd ?” определяет переменную stdout как двойное слово
(double word), которое выделяет 4 байта в памяти и инициализирует их значением по умолчанию,
равным 0.
Ключевое слово “dd” означает "определить двойное слово", а знак вопроса ? указывает, что
переменная не имеет начального значения и будет проинициализирована при выполнении
программы.
Фрагмент кода “msg db "Hello, world!",0dh,0ah” определяет байтовую строку “msg” в данном
контексте - это метка (label) в программе, которая используется для определения байтовой строки
(string) в сегменте данных. Которая состоит из ASCII символов "Hello, world!" и двух управляющих
символов - возврата каретки (0dh) и перевода строки (0ah). Ключевое слово “db” означает
"определить байт" и используется для определения байтовых строк. В данном случае, каждый
символ строки занимает один байт в памяти компьютера.
cWritten в данном контексте - это метка (label) в программе, которая используется для
определения переменной типа Doubleword в сегменте данных.
Метка cWritten указывает на начало определения переменной, которая будет использоваться для
хранения количества байт, записанных функцией WriteConsoleA. Таким образом, метка cWritten
обеспечивает способ обращения к началу определения переменной в программе, а тип
Doubleword определяет, сколько памяти будет выделено для хранения значения этой
переменной.

5.

Разбор кода
.code
start:
invoke GetStdHandle, -11
mov stdout,eax
invoke WriteConsoleA, stdout, ADDR msg,\
sizeof msg, ADDR cWritten, 0
invoke ExitProcess, 0
end start
Директива .code указывает на начало секции кода
программы.
“start:” в данном контексте - это метка (label),
обозначающая точку входа в программу.
Команда “invoke” в ассемблере MASM
используется
для
вызова
процедур
из
динамических библиотек (DLL) или для вызова
процедур из других модулей программы.
“invoke GetStdHandle, -11 mov stdout,eax” - Эти строки вызывают функцию GetStdHandle из
библиотеки kernel32.dll, которая возвращает дескриптор стандартного устройства вывода.
Полученный дескриптор затем сохраняется в регистре eax и копируется в переменную stdout,
объявленную в сегменте данных.
“invoke WriteConsoleA, stdout, ADDR msg, sizeof msg, ADDR cWritten, 0 ” - Эта строка вызывает
функцию WriteConsoleA, которая записывает байтовую строку в стандартный вывод. Аргументы
функции:
stdout - дескриптор устройства вывода
ADDR msg - адрес байтовой строки, которую нужно вывести
sizeof msg - размер байтовой строки в байтах
ADDR cWritten - адрес переменной, которая будет использована для хранения количества байт,
записанных в вывод
0 - флаги вывода, которые можно использовать для изменения способа вывода данных.
“invoke ExitProcess, 0” - Эта строка вызывает функцию ExitProcess из библиотеки kernel32.dll, которая
завершает процесс. Аргумент 0 указывает на успешное завершение процесса.
Директива end указывает на конец программы. start - это метка, которая указывает на начало кода
программы, поэтому end start означает, что программа завершается на метке start.

6.

По шаговое выполнение
1.
2.
3.
4.
5.
6.
Открываем командную строку
Прописываем путь до компилятора
Прописываем команду для компиляции кода (Создастся объектный
файл, находиться там же где и компилятор)
Прописываем команду для создания исполняемого файла (в
команде прописываете созданный объектный файл, в результате
исполняемый файл с расширением «.EXE», будет находиться там
же где и компилятор и ранее созданный объектный файл)
Открываем наш ново созданный «.exe» файл в отладчике OllyDbg
(в результате наш файл откроется в компиляторе, и откроется
консоль с названием нашей программы рисунок-1)
В отладчике OllyDbg нажмите кнопку запуск или кнопку F9 на
клавиатуре, в результате выполнение программы, в консоле мы
увидим “Hello, word!”

7.

Рисунок-1
English     Русский Rules