Ассемблер для процессоров Intel Pentium
Шрифт:
Популярный компилятор TASM, к сожалению, более не поддерживается, и его развитие закончилось несколько лет назад. Серьезным недостатком этого компилятора при всей его привлекательности является невозможность работы с современными архитектурами процессоров Intel, поддерживающими технологии параллельной обработки данных (SIMD).
Хочу уточнить, что мы будем создавать и анализировать программы и процедуры с использованием компилятора ассемблера версий не ниже 6.14.хххх, а при рассмотрении технологий SIMD —не ниже 7.10.хххх. Очень удобен для этих целей свободно распространяемый пакет программ MASM32, содержащий помимо компилятора версии 6.14 также редактор исходных текстов
Рассмотрим более подробно процесс ассемблирования программ с помощью макроассемблера MASM. Должен заметить, что ассемблирование программ практически не различается для версий 6.14.хххх и выше.
Пакет MASM фирмы Microsoft включает в себя основные программы, необходимые для создания, отладки и сопровождения программ на языке ассемблера. Процесс создания и выполнения программ на языке ассемблера состоит из двух шагов:
1. Ассемблирование (assembling) исходного текста программы в объектный файл. Файл, содержащий исходный текст программы на ассемблере, имеет расширение ASM, a получаемый в результате ассемблирования объектный файл – расширение OBJ.
2. Компоновка полученного объектного файла вместе с другими объектными файлами и/или библиотеками в исполняемый файл (с расширением ЕХЕ).
Ассемблирование исходного текста выполняет утилита ml.exe, входящая в состав макроассемблера, а сборку всей программы – утилита link.exe. Эти утилиты могут как выполняться из командной строки, так и включаться в состав программных сценариев. Как ml, так и link принимают множество параметров, часть из которых рассматривается далее.
В состав макроассемблера включен ряд других очень полезных программ, но мы сосредоточим внимание только на утилитах ml и link, поскольку именно они будут использованы при разработке программ и процедур в этой книге. Читатели, заинтересованные в более глубоком изучении возможностей макроассемблера MASM, легко обнаружат полные описания всех программ пакета в Интернете.
После того как исходный текст ассемблерной программы разработан, можно указать специальные условия для его ассемблирования при помощи директивы OPTION. Эта директива имеет несколько параметров, позволяющих управлять процессом ассемблирования программы.
Проанализируем более подробно каждый из этапов создания программ на языке ассемблера.
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-разрядных ЕХЕ-файлов следует использовать корректную версию компоновщика, при этом командная строка должна выглядеть так: