- •Системное программирование на макроассемблере 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
- •Неразрешённые внешние ссылки
- •Выполнение работы
- •Программные инструменты для работы
- •Изготовление файлов для сравнений
- •Восстановление структуры двоичного представления объектного файла
- •Анализ неразрешенных внешних ссылок в объектном файле
- •Состав отчета по работе
- •Исполнение программы под отладчиком
- •Оперативная память «физическая» и виртуальная
- •Выполнение работы
- •Подготовка текстовых файлов для работы
- •Исследование структуры ехе-файла
- •Исследование выполнения программы под отладчиком
- •Карта размещения программы в виртуальной оперативной памяти
- •Действительные ссылки, бывшие раньше неразрешенными
- •Состав отчета по работе
- •Вопросы для самопроверки
- •Рекомендованная литература
Выполнение работы
Исходное состояние – шаблон минимальной учебной программы:
include \masm32\include\masm32rt.inc
comment * ===========================
Шаблон минимальной учебной программы
* ===================================
.data
.code
start:
;ТОЧКА А
Invoke ExitProcess,0 ; выход в Windows
end start
Сохраните его в файле сio.asm.
Эксперимент 1. Ввод-вывод функциями Win32
Цель эксперимента – испытание возможностей прямого вызова функций консольного ввода-вывода из APIWin32, наблюдение результатов, оценка трудоемкости этих действий.
Задача: ввести в программу текст функцией ReadFile, затем тот же текст вывести на консоль функциейWriteFile.
Для выполнения этой задачи нужно использовать примеры, приведенные в разделе теоретических сведений (Фрагменты 1…4).
В качестве шаблона-заготовки используйте cio.asm. Скопируйте его в файлcio-api.asm. Внесите в его секцию данных описания переменных, приведенных во Фрагментах 1 и 3.
В секцию кода внесите Фрагмент 4 (это ввод), ниже – фрагмент 2 (это вывод).
Выполнить согласование. Откорректируйте Фрагмент 2, чтобы вводной буфер Фрагмента 4 сразу использовался как выводной буфер во фрагменте 2. Кроме того, при вводе функция ReadFile(во фрагменте 4) сосчитает количество фактически введенных смволов и сохранит его в назначенной переменной. Измените Фрагмент 2 так, чтобы это число сразу правильно подставлялось как параметр в вызовWriteFile. Тогда эхо-вывод введенного текста произойдет без ошибок.
Выше строчки
invoke ExitProcess,0
вставьте вызов макроса для задержки окна консоли:
inkey
Сохраните программу со всеми выполненными изменениями. Распечатайте ее и включите в отчет.
Выполните создание программы вызовом (можно в TotalCommander)
buildc cio-api
Выполните cio-api.exe. Сделайте скриншот исполнения, включите его в отчет.
Эксперимент 2
Цель эксперимента – испытание макросов консольного ввода и вывода, наблюдение результатов, оценка трудоемкости этих действий.
Будем использовать как исходный файл сio.asm.
В секцию данных (после .data) вписатьlpNumString dd 0
Ниже строки ; ТОЧКА Авставитьinkey "Нажми пробел..."
В секцию кода (после .start) дописатьmov lpNumString, input("Введите 16ричное число: ") print "На самом деле введен текст " print lpNumString,13,10
Сохранить изменения. Распечатать программу в этом состоянии, включить в отчет.
Создать программу консольным вызовом (можно в TotalCommander)buildc cio
Выполнить cio.exe, убедиться, что всё работает.
Сделать скриншот выполнения эксперимента для отчета.
Эксперимент 3
Цель эксперимента – преобразование строки в число и числа в строку, наблюдение результатов этих преобразований.
В cio.asmвыше строки; ТОЧКА Авставить фрагмент; Строку преобразую в число mov EDX, h2ud(lpNumString) ;в EDX - адрес числа comment * Примечание. Макрос h2ud считает строку 16тиричной записью числа, а a2ud - 10тичной. И тот, и другой возвращают указатель * на сформированное в памяти число. mov EBX, DWORD PTR [EDX] ; разыменование: число в ЕВХ print "Обратный вывод введенного числа = ",13,10 print str$(EBX),13,10 print "То же число, но 16-рично: " ;пробую hex-вывод print hex$(EBX),13,10
Сохранить изменения. Распечатать программу в этом состоянии, включить в отчет.
Создать программу консольным вызовом (можно в TotalCommander)buildc cio
Выполнить cio.exe, убедиться, что всё работает.
Сделать скриншот выполнения эксперимента для отчета.