- •Системное программирование на макроассемблере 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
- •Неразрешённые внешние ссылки
- •Выполнение работы
- •Программные инструменты для работы
- •Изготовление файлов для сравнений
- •Восстановление структуры двоичного представления объектного файла
- •Анализ неразрешенных внешних ссылок в объектном файле
- •Состав отчета по работе
- •Исполнение программы под отладчиком
- •Оперативная память «физическая» и виртуальная
- •Выполнение работы
- •Подготовка текстовых файлов для работы
- •Исследование структуры ехе-файла
- •Исследование выполнения программы под отладчиком
- •Карта размещения программы в виртуальной оперативной памяти
- •Действительные ссылки, бывшие раньше неразрешенными
- •Состав отчета по работе
- •Вопросы для самопроверки
- •Рекомендованная литература
InputBuffer db 25 dup (0) ; вводной буфер фрагмент 3
bLen dd 23 ; длина буфера ввода, нужна при вводе
ProchitanoByte dd 0 ; сколько байт фактически было введено
PotokStdIn dd ? ; для записи манипулятора Стд Потока Ввода
.code ; сегменткода
; ФРАГМЕНТ4
invoke GetStdHandle,STD_INPUT_HANDLE
mov PotokStdIn, eax ; запросилиуWindowsманипуляторстдпотокаввода
; Задатьсвойствапотокаввода
invoke SetConsoleMode,PotokStdIn,\
ENABLE_LINE_INPUT or \ ; закончить по Enter
ENABLE_ECHO_INPUT or \ ; выводить вводимое (ввод с эхом)
ENABLE_PROCESSED_INPUT ; обрабатывать строчные символы CR,LF,BS и Сtrl-C
invoke ReadFile, PotokStdIn, ADDR InputBuffer, bLen, ADDR ProchitanoByte, NULL
Как видно из описанного, использование функций WriteFile() иReadFile() решает задачу ввода-вывода, но их использование достаточно утомительно – слишком много всяких предварительных организующих действий. Вполне понятно стремление программистов «упрятать» эти излишние конечному пользователю подробности внутрь то ли процедур, то ли макросов. Тогда повторное использование ввода-вывода станет внешне более простым, значит, более удобным.
К счастью, создателями пакета MASM32 эта работа успешно проделана. Нам остается только научиться правильно пользоваться этими средствами. Мы не будем здесь пока рассматривать процедуры, упрощающие ввод-вывод, а рассмотрим только некоторые макросы, решающие ту же задачу.
Высокоуровневый консольный ввод-вывод с использованием макросов
Приличного объема библиотека готовых макросов пакета MASM32 приведена в файле d:\MASM32\macros\macros.asm. Мы подключаем эту библиотеку к нашим программам директивой
include \masm32\macros\macros.asm
Маленькая тонкость состоит в том, что большинство этих макросов внутри себя содержат вызовы функций Win32, поэтому эту директиву лучше размещать в программепоследиректив подключения системных библиотек:
include \masm32\include\windows.inc; main windows include file
include \masm32\include\masm32.inc ; masm32 library include
Comment * -------------------------------
Windows API include files
-------------------*---------------------
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\Comctl32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\shell32.inc
include \masm32\include\oleaut32.inc
include \masm32\include\ole32.inc
include \masm32\include\msvcrt.inc
include \masm32\include\dialogs.inc ; macro file for dialogs
Впрочем, в используемых нами примерах так оно и есть.
Рассмотрим несколько самых употребительных макросов для консольного ввода-вывода.
Макрос консольного вывода print
Гибкий и мощный макрос. Показывает строку, задаваемую указателем на неё:
print lptext
Умеет показывать как последующие параметры любую комбинацию строчек в кавычках и байтов, заданных числами:
print lptext, “ продолжение вывода ”,13,10
Указатель строки в вызове printможет отсутствовать, но, если он есть, он должен указываться только на первом месте.
При использовании printследует помнить, что он меняет значение регистраEAX. Поэтому, если нужно сохранить ЕАХ, следует использовать связку
Push EAX
Print c параметрами
Pop EAX
Приведенные примеры использования printпоказывают, что он вызывается с использованиемпроцедурногосинтаксиса. Далее будут примеры других макросов сфункциональнымсинтаксисом использования.