
- •Системное программирование на макроассемблере 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
- •Неразрешённые внешние ссылки
- •Выполнение работы
- •Программные инструменты для работы
- •Изготовление файлов для сравнений
- •Восстановление структуры двоичного представления объектного файла
- •Анализ неразрешенных внешних ссылок в объектном файле
- •Состав отчета по работе
- •Исполнение программы под отладчиком
- •Оперативная память «физическая» и виртуальная
- •Выполнение работы
- •Подготовка текстовых файлов для работы
- •Исследование структуры ехе-файла
- •Исследование выполнения программы под отладчиком
- •Карта размещения программы в виртуальной оперативной памяти
- •Действительные ссылки, бывшие раньше неразрешенными
- •Состав отчета по работе
- •Вопросы для самопроверки
- •Рекомендованная литература
Неразрешённые внешние ссылки
При переводе команд исходного текста в машинный (объектный) числовой код всё время встречается проблема неопределённости адресов чтения-записи данных и адресов передачи управления (если программист запрограммировал такие передачи, например, в программе имеются вызовы процедур или условные и безусловные переходы).
На этапе компиляции программы эти адреса не могут быть определены в принципе. Почему? По той простой причине, что они становятся известными только после сборкивсех секций в единый исполняемый ехе-модуль.
(Продолжая приведенную выше строительную аналогию про сборный коттедж, можно привести простой пример. На чердаке коттеджа запланирован отопительный водогрейный котёл. Можно ли при изготовлении модуля чердака сразу сказать, сколько метров трубы нужно для соединения этого котла с местом ввода воды в дом? Любой строитель рассмеётся в ответ: «Позвольте – скажет он – как мы можем знать, где на стройплощадке каждого покупателя нашего сборного коттеджа будет ввод воды?! У одного он прямо возле дома, а у другого за 100 метров. Трубы отмеряются «по месту» прямо на стройплощадке, когда коттедж уже установлен и собран». В этом примере неизвестная длина трубы – это и есть аналогия пока неизвестного «адреса доставки воды к котлу». Проектировщик будет писать проектную ведомость заказа материалов и в строчке «труба для подвода воды» в графе «длина» он поставит… Что? Правильно, НИЧЕГО. Графа останется пустой. И вот эта пустая (или заполненная пока нулём) графа - это и есть «неразрешённая внешняя ссылка» в проекте.)
Но невозможность определить значение адреса не мешает зарезервировать под него место в объектном коде, что и делается. Ведь известно, что адрес занимает 4 байта (32 бита), эти байты и резервируются. Для определенности их нужно чем-то заполнить. В простейших случаях заполняют нулями, но можно туда поместить и какую-нибудь полезную на будущее информацию, к примеру, смещение адреса чтения (записи) относительно базовой метки. Такие поля в объектном коде и называются «неразрешённые внешние ссылки». Слово «неразрешённые» здесь означает не «запрещенные», а скорее «не получившие окончательного решения», то есть попросту «недовычисленные».
Эта недовычисленность ссылок имеет место только в объектном файле. Именно поэтому объектные файлы и являются промежуточнойформой преобразования данных при создании программы. Когда компоновщик собирает исполняемый модуль из секций объектного файла, то он вписывает в поля неразрешённых ссылок правильные действительные адреса. Но подробнее об этом – в следующей лабораторной работе.
Выполнение работы
Если охарактеризовать кратко суть выполняемой здесь работы, то её можно назвать “reverse engeneering”, то есть «обратная разработка». Это такая работа, в которой по имеющемуся файлу, созданному [пока] непонятно как, восстанавливается (хотя бы в основных частях) его внутренняя структура и, таким образом, составляется обоснованное мнение о назначении файла и способах его дальнейшего использования. Именно это мы должны проделать с объектным файлом формата COFF (Common Object File Format).