
- •Юрий Магда Ассемблер для процессоров Intel Pentium
- •Аннотация
- •Юрий Магда Ассемблер для процессоров Intel Pentium Введение
- •Структура книги
- •От издательства
- •Глава 1 Базовая архитектура процессоров Intel x86
- •Глава 2 Основы создания приложений на языке ассемблера
- •2.1. Ассемблирование исходного текста
- •2.2. Компоновка программ
- •Глава 3 Синтаксис языка ассемблера
- •3.1. Представление данных в компьютере
- •3.2. Первичные элементы языка ассемблера
- •3.3. Программная модель процессора Intel Pentium
- •Глава 4 Структура программы на языке ассемблера
- •4.1. Организация сегментов
- •4.2. Директивы управления сегментами и моделями памяти макроассемблера masm
- •4.3. Структура программ на ассемблере masm
- •Глава 5 Организация вычислительных циклов
- •5.1. Условные переходы и ветвления
- •5.2. Команда безусловного перехода jmp
- •5.3. Организация циклов
- •5.4. Оптимизация кода в процессорах Intel Pentium
- •Конец ознакомительного фрагмента.
2.1. Ассемблирование исходного текста
Программа ml.exe выполняет два последовательных действия при создании исполняемого файла программы. Во‑первых, она обеспечивает трансляцию исходного текста программы в промежуточный объектный файл. Во‑вторых, ml.exe вызывает программу link.exe, которая компонует объектные файлы и библиотеки в единую выполняемую программу.
В процессе трансляции исходного текста программы выполняются следующие действия:
1. Анализируются директивы условного ассемблирования, и в случае истинности указанных в них условий выполняются те или иные шаги.
2. Разворачиваются макросы.
3. Вычисляются константные выражения, такие, например, как mydata and 10h, при этом выражения замещаются вычисленными значениями.
4. Декодируются команды и операнды, не находящиеся в памяти. Например, на этом шаге будет декодирована команда mov AX, 10, поскольку она не имеет операндов, расположенных в памяти.
5. Сохраняются смещения переменных в памяти как смещения относительно сегментов, в которых эти переменные расположены.
6. Сегменты и их атрибуты размещаются в объектном файле.
7. В объектном файле сохраняются перемещаемые адреса (relocatable addresses).
8. При необходимости создается файл листинга.
9. Непосредственно программе link.exe передаются некоторые директивы (например, INCLUDELIB и D0SSEG).
Директивы условного ассемблирования более подробно описаны в руководстве по макроассемблеру MASM 6.14 фирмы Microsoft.
2.2. Компоновка программ
После успешной трансляции исходного текста ассемблерной программы результат в виде объектного файла передается компоновщику link.exe. Компоновщик может связать несколько объектных файлов в один исполняемый ЕХЕ‑файл. При этом все сегменты, определенные в программе, группируются в соответствии с инструкциями, содержащимися в объектном файле. Вся информация о размещении сегментов записывается в заголовок исполняемого файла.
Здесь следует упомянуть о том, что структура программы (не только на ассемблере) определяется несколькими факторами:
– архитектурой процессора;
– особенностями той операционной системы, под управлением которой эта программа будет выполняться;
– правилами работы выбранного компилятора – разные компиляторы предъявляют разные требования к исходному тексту программы.
Например, исходный текст простой 16‑разрядной программы, выводящей строку str на экран в операционной системе MS‑DOS, может выглядеть так:
Эта программа выполняется только в операционной системе MS‑DOS и не работает в таких операционных системах, как Windows 2000 и Windows XP, поскольку структура исполняемого файла не соответствует требованиям, выдвигаемым этими операционными системами. Чтобы программа могла вывести строку на экран, например, в Windows XP, требуется кардинальным образом изменить структуру программы.
Кроме этого, программы для операционных систем MS‑DOS и Windows требуют задания различных параметров компилятора и компоновщика, что вызвано различной организацией операционных систем MS‑DOS и Windows. Операционная система MS‑DOS использует 16‑разрядную модель памяти в реальном режиме, в то время как Windows XP, например, 32‑разрядный защищенный режим с линейной адресацией памяти. Далее мы проанализируем основные параметры компилятора ml.exe и компоновщика link.exe макроассемблера MASM для создания различных типов приложений.
Трансляцию файлов с расширением ASM можно выполнить из командной строки:
ml /с /coff имя_файла.asm
Созданный при помощи этой команды объектный файл имеет формат COFF. Если параметр /coff не задан, то форматом созданного объектного файла будет OMF.
Компоновщик link.exe оперирует с OBJ‑файлами как в формате COFF, так и в формате OMF, при этом выполняется автоматическое преобразование формата файла из OMF в COFF. Обычно при генерации исполняемых файлов используется формат COFF. Кроме того, и это очень важно, если файл объектного модуля должен применяться в приложении, написанном на Visual C++ .NET, то формат его обязательно должен быть COFF. В то же время при применении объектного файла в приложении, разработанном в Borland Delphi 2005, единственным воспринимаемым форматом является OMF.
Для того чтобы из объектного файла создать исполняемый файл, работающий в MS‑DOS, следует выполнить командную строку
link /со имя_файла. ob;
Здесь следует учитывать то, что версия компоновщика link.exe должна поддерживать генерацию 16‑разрядных приложений MS‑DOS. Использование 32‑разрядных компоновщиков приведет к ошибке создания ЕХЕ‑файла.
Для генерирования 32‑разрядных ЕХЕ‑файлов следует использовать корректную версию компоновщика, при этом командная строка должна выглядеть так:
link /SUBSYSTEM:WINDOWS /0PT:N0REF имя_фдйла.ob;
Приведенных здесь сведений вполне достаточно для компиляции исходных текстов ассемблерных программ и процедур, представленных в книге. Более подробная информация о пакете MAS M доступна в Интернете, а также в многочисленных литературных источниках.
В последующих главах мы рассмотрим структуру данных и синтаксис команд макроассемблера MASM.