Магда Юрий
Шрифт:
В процессе трансляции исходного текста программы выполняются следующие действия:
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.
Глава 3Синтаксис языка ассемблера
Язык ассемблера, называемый также языком символического кодирования, представляет собой машинный язык в символической форме, которая более понятна и удобна программисту. Сложная внутренняя структура, разнообразные форматы команд, многочисленные режимы адресации процессоров Intel ограничивают возможности разработки сложных и объемных программ на языке ассемблера. Однако в любых сложных программах всегда существуют критические секции, требующие интенсивных и быстрых вычислений, которые приходится разрабатывать не на языке высокого уровня, а на ассемблере.