- •Системное программирование на макроассемблере 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
- •Неразрешённые внешние ссылки
- •Выполнение работы
- •Программные инструменты для работы
- •Изготовление файлов для сравнений
- •Восстановление структуры двоичного представления объектного файла
- •Анализ неразрешенных внешних ссылок в объектном файле
- •Состав отчета по работе
- •Исполнение программы под отладчиком
- •Оперативная память «физическая» и виртуальная
- •Выполнение работы
- •Подготовка текстовых файлов для работы
- •Исследование структуры ехе-файла
- •Исследование выполнения программы под отладчиком
- •Карта размещения программы в виртуальной оперативной памяти
- •Действительные ссылки, бывшие раньше неразрешенными
- •Состав отчета по работе
- •Вопросы для самопроверки
- •Рекомендованная литература
Параметризация макросов
Макросы могут иметь формальные строковые параметры, которые перечисляются в строке заголовка после слова MACRO через запятую. Например, приведенное выше макроопределение можно переделать в параметризованное так.
Считалка MACRO парам1, п2, па3, параметр4, п5
парам1, п2, па3, параметр4, п5
Всем ребятам надо спать.
ENDM
Тогда при макровызове можно задать фактические параметры, которые будут подставлены на место формальных при макрорасширении:
Считалка Мы , , устали, , танцевать
будет преобразована макрогенератором в макрорасширение:
Мы,, устали,, танцевать
Всем ребятам надо спать.
Обратите внимание, что здесь второй и четвертый фактический параметры заданы пустыми. Фактический параметр заменяет в теле макроопределения формальный по принципу «строка заменяет строку».
Уникальность меток при макрорасширениях
В макросах могут встречаться метки. Вот, например, макрос, который устанавливает флаги процессора в соответствии со значением параметра, а затем, если флаг знака S != 1 (старший бит равен 0, это значит, что если число рассматривать как знаковое, то оно положительное), то следует «перепрыгивание» на метку (число положительное, делать ничего не надо), а иначе число преобразуется в такое же, но с противоположным знаком. Короче, это вычисление абсолютной величины параметра. Слов много, а в ассемблерных командах все делается проще некуда:
Absval MACRO param
test param, param
jns metka
neg param
metka:
EMDM
В этом макросе кроется принципиальная ошибка. Суть её в том, что сколько раз будет произведена макрорасширение Absval, столько раз в исходный текст будет подставлена метка metka: . Мы помним, что метки – это адресные константы, равные адресу (смещению) метки в секции кода. Если в программе окажутся одинаковые метки в разных местах программы, то компилятор не разберётся с этой проблемой: у адресной константы не может быть одновременно несколько разных значений. Результат очевиден – компиляция прерывается с ошибкой «Повторяющиеся метки».
Выход из этой ситуации прост. Пусть макрогенератор сам «выдумывает» уникальные имена меток при выполнении макрорасширений. Чтобы он это стал делать, надо объявить встречающиеся в теле макроса метки как «локальные». Это надо написать сразу после заголовка макроопределения:
Absval MACRO param
LOCAL metka
test param, param
jns metka
neg param
metka:
EMDM
Теперь макровызов Absval EDXбудет расширено в
test EDX, EDX
jns ??0000
neg EDX
??0000:
Второй макровызов, пусть это будет Absval AL,будет расширен в
test AL, AL
jns ??0001
neg AL
??0001:
Имена ??0000 и ??0001 – это и есть уникальные имена меток, которые сочинил сам макрогенератор. Компилятор образует их из буквенной строки «??» и лепит справа символьную 16-ричную запись номера метки в диапазоне от 0000 до FFFF. (Известно, что символ ? в ассемблере рассматривается как буква, поэтому искусственные имена ??0000, ??0001 и т.д. синтаксически совершенно корректны). Номер увеличивается на 1 при каждом новом макрорасширении. Поучается, что макрогенератор в одной программе способен создать 0FFFFh = 65536 искусственных меток. Такое возможное их количество перекрывает все мыслимые практические потребности.