- •Системное программирование на макроассемблере masm32
- •Содержание
- •Вступление
- •Префиксы «венгерской» нотации типов данных в описаниях вызовов функций аpi Win32 (Win64)
- •Работа с консолью
- •Цель работы
- •Теоретические сведения
- •Консоль
- •Начальные настройки
- •Как в cmd.Exe выделять-копировать-вставлять текст
- •История ввода команд
- •Заменяющие символы в шаблонах имён
- •Выполнение работы
- •Навигация по дискам и папкам
- •Поиск файлов и папок по имени или шаблону
- •Копирование, перенос, переименование и удаление файлов
- •Создание и уничтожение папок
- •Создание текстового файла
- •Просмотр содержимого файлов
- •Поиск файлов, содержащих нужную строку
- •Состав отчета по работе
- •Состав пакета масм
- •Последовательность создания исполняемого ехе-модуля на масм
- •Режимы компоновки
- •Выполнение работы
- •Создание консольной программы
- •Создание программы с графическим интерфейсом
- •Использование шаблона простой программы
- •Состав отчета по работе
- •Параметризация макросов
- •Уникальность меток при макрорасширениях
- •Макроконстанты
- •Макропеременные и макровычисления
- •Увидеть работу макрогенератора
- •Расширенный листинг
- •Выполнение работы
- •Макроопределение и макрорасширение
- •Повторение строк repeat
- •Цикл for
- •Анализ расширенного листинга программы
- •Состав отчета по работе
- •Потоки вывода и ввода
- •Вывод и ввод в консольных приложениях
- •Invoke GetStdHandle,std_output_handle ; манипулятор возвращен в еах, ...
- •InputBuffer db 25 dup (0) ; вводной буфер фрагмент 3
- •Высокоуровневый консольный ввод-вывод с использованием макросов
- •Макрос консольного вывода print
- •Макросыконсольного вводаinput и inkey
- •Преобразование строки в число
- •Inkey "Жду кнопочку."
- •Преобразование числа в строку
- •Выполнение работы
- •Invoke ExitProcess,0 ; выход в Windows
- •Эксперимент 1. Ввод-вывод функциями Win32
- •Эксперимент 2
- •Эксперимент 3
- •Эксперимент 4
- •Состав отчета по работе
- •Последовательное выполнение команд
- •Передача управления в другое место кода
- •Возврат управления в основную программу
- •Метка_к5:
- •Jmp Метка_к5
- •Call метка_процедуры
- •Передача параметров в процедуру
- •Внутренние переменные в процедурах
- •Как компилятор ml.ExEпомогает организовать работу с процедурами
- •Автоматическое создание пролога и эпилога
- •Автоматическое размещение внутренних переменных
- •Повышение надежности и облегчение вызовов – макрос invoke
- •Выполнение работы
- •Invoke ExitProcess,0 ; выход в Windows
- •Неразрешённые внешние ссылки
- •Выполнение работы
- •Программные инструменты для работы
- •Изготовление файлов для сравнений
- •Восстановление структуры двоичного представления объектного файла
- •Анализ неразрешенных внешних ссылок в объектном файле
- •Состав отчета по работе
- •Исполнение программы под отладчиком
- •Оперативная память «физическая» и виртуальная
- •Выполнение работы
- •Подготовка текстовых файлов для работы
- •Исследование структуры ехе-файла
- •Исследование выполнения программы под отладчиком
- •Карта размещения программы в виртуальной оперативной памяти
- •Действительные ссылки, бывшие раньше неразрешенными
- •Состав отчета по работе
- •Вопросы для самопроверки
- •Рекомендованная литература
Выполнение работы
Создайте рабочую папку d:\MACRO.
Для наблюдений за работой макрогенератора создадим предельно простой шаблон, еще проще, чем во второй лабораторной работе. Исключим подключение всех inc файлов и библиотек (если их оставить, то это в текстовый исходник добавит ни много, ни мало, а около 40 тысяч строк; здесь нам это совершенно ни к чему, только будут мешать наблюдениям). Итак, наи-наипростейший шаблон:
.486
.MODEL flat, stdcall
; точка1 - место макроопределений
.data
; точка2 - секция данных
.code
; точка3 - секция кода
end
Поместите его в рабочую папку под именем, например, m0.asm.
Второе, что понадобится для удобства работы – пакетный файл, пусть для конкретности он будет называться mg.bat и его мы тоже разместим в рабочей папке:
:: --------------- MG.BAT ----------------
@echo Обрабатывется файл %1.ASM.
@if exist %1.lst del %1.lst
\masm32\bin\ml /EP /nologo %1.asm > %1.lst
@echo.
@echo Результат работы макрогенератора (%1.LST)
@echo -------------------------------------------------
@type %1.lst
@pause
Приступаем к экспериментам.
Макроопределение и макрорасширение
Скопируйте m0.asm в m1.asm и в него, в точку 1, вставить макроопределение mdef MACRO Просто текст mov eax, edx ; обычная команда
;с обычным комментарием ;; Скрытый комментарий push edx ;; обычные pop esi ;; команды endm
В точку 3 вставить макровызов mdef.
Выполнить mg m1. Наблюдать результат. Как отреагировал макрогенератора на строчку «Просто текст»? Наблюдаемое описать в отчете.
Закомментировать строчку «Просто текст», пересохранить m1.asm. Опять выполнить mg m1.
Файлы m1.asm и m1.LST разместить в отчете в двух соседних колонках таблицы, чтобы можно было наглядно сравнивать.
В отчете описать: что произошло при макрорасширении с комментариями обычными (;) и скрытыми (;;); как поступил макрогенератор с другими частями тела макроопределения.
Повторение строк repeat
Скопируйте m0.asm в m2.asm и в него, в точку 2 вставить фрагмент A=1 Massiv Label Word Repeat 10 Dw A*A A = A+1 Endm
Выполнить mg m2. Наблюдать результат.
Файлы m2.asm и m2.LST разместить в отчете в двух соседних колонках таблицы, чтобы можно было наглядно сравнивать.
В отчете описать: что произошло при макрорасширении.
Цикл for
Скопируйте m0.asm в m3.asm и в него, в точку 2 вставить фрагмент massiv label word for y, <1,4,9,16,25> dw y endm
В точку 3 вставить фрагмент For x,<1,3,5,7,9> mov eax, x endm
Выполнить mg m3. Наблюдать результат.
Файлы m3.asm и m3.LST разместить в отчете в двух соседних колонках таблицы, чтобы можно было наглядно сравнивать.
В отчете описать: что произошло при макрорасширении.
Анализ расширенного листинга программы
Создайте исходный файл coff1.asm такого содержания:
include \masm32\include\masm32rt.inc
; ИЗУЧЕНИЕ РАСШИРЕННОГО ЛИСТИНГА
;< 1. Здесь можно описывать макросы.>
macrodef MACRO par1, par2, par3
LOCAL M3
mov par2, par1 ; обычная команда
;с обычным комментарием
;; Скрытый комментарий
M3:
push par3 ;; обычные
pop par2 ;; команды
endm
.data
;<2. Здесь можно описывать статические переменные. >
Num1 dd 11223344h, 55667788h
Str1 db "ABCDEF", 0
.code
start:
;<3. Здесь можно вводить команды программиста. >
Mov EAX, Num1 ; 11223344
Mov dl, [Str2 + 3] ; J
macrodef EAX, EDX, Num1
.data
;<4. Здесь можно описывать статические переменные. >
Num2 dd 99aabbcch, 0ddeeff00h
Str2 db "GHIJKLM",0
.code
;<5. Здесь можно вводить команды программиста. >
Mov EBX,[Num2 + 4] ; DDEEFF00
Mov dl, [Str1 +4] ; E
macrodef Num2, ESI, EAX
; 6. примеры реальных вызовов макросов и процедур
print "Hello, world!" ; макрос сообщения
;--------------------------------------
invoke ExitProcess,0 ; выход в Windows
end start
Создайте пакетный файл LstExt.bat такого содержания:
@echo off
echo РАСШИРЕННЫЙ ЛИСТИНГ файла %1
ECHO.
ml /c /coff /Fl%1.ELST /Sa %1
PAUSE
Выполните LstExt coff1.asm. Результаты - это объектный файл coff1.obj и файл расширенного листинга coff1.asm.ELST который в данный момент нас интересует больше всего. Объектный файл нам тоже понадобится, но в следующей лабораторной работе.
Откройте coff1.asm.ELST в Notepad++ (кодировка Кириллица ОЕМ 866). Не удивляйтесь тому, что объем этого текстового файла около полумегабайта, и что он включает «всего-то» 101 тысячу с лишним строчек. Это – следствие подключения всех inc-файлов, скрыто упомянутых в первой строчке coff1.asm, и разворачивания всех попутно попадающихся там макровызовов. Разумеется, нам всёэто в данной работе совершенно не нужно, поэтому надо удалить из coff1.asm.ELST всё лишнее. Открываем поиск Ctrl-F , вводим «ИЗУЧЕНИЕ», «Искать далее», и устанавливаем курсор перед строчкой «; ИЗУЧЕНИЕ ЛИСТИНГОВ». Shift-Ctrl-Home выделит всёдоэтого места. Del. Верхний мусор удалён.
Пролистать листинг вниз, установить курсор в конце строки «end start». Shift-Ctrl-End выделит всё от этого места до конца документа. Del. Нижний мусор также удалён. Сохранить «обрезанный» листинг.
Скопировать в отчет coff1.asm и укороченный coff1.asm.ELST.
Провести сопоставление (ради этого, в общем, всё описываемое здесь и затевалось). Вручную обвести ручкой в исходнике рамочками строчки макровызовов со словами «macrodef», «print» и «invoke». Каждую рамочку снабдить числовой выноской. Такую же работу выполнить в coff1.asm.ELST. То есть снабдить пронумерованными рамочками результаты макрорасширения всех макровызовов.
Сравнить визуально «что писалось в исходнике» с тем, «что поместил в листинг макрогенератор». Письменно прокомментировать и объяснить в отчете наблюдаемое. Особое внимание уделить тому, как передавались параметры макровызовов в макрорасширение и как обрабатываются локальные метки макроопределений при повторных макрорасширениях одного и того же макроопределения.