Ассемблер для процессоров Intel Pentium
Шрифт:
Аппаратно микроархитектура NetBurst реализована в виде быстродействующей (400 МГц) системной шины, обладающей впечатляющими возможностями по обработке данных:
– производительность операций – до 3,2 Гбайт/с, что более чем в 3 раза превышает производительность Pentium III;
– тактовая частота шины – 100 МГц с возможностью учетверения скорости (400 МГц);
– высокая степень конвейеризации транзакций;
– возможность доступа к 128-разрядным данным посредством 64-разрядных элементов;
– совместимость с существующим программным обеспечением и операционными системами, разработанными для архитектуры IA-32.
Глава 2Основы
создания приложений на языке ассемблера
Материал этой главы посвящен основам создания программ на языке ассемблера, известном также как язык символического кодирования. Язык ассемблера является одним из самых сложных, поскольку требует знания аппаратно-программной архитектуры процессора и особенностей его функционирования. Сложная внутренняя структура, разнообразные форматы команд, многочисленные режимы адресации процессоров Intel x86 ограничивают возможности разработки сложных и объемных программ на языке ассемблера.
Если же требуется разработать небольшое быстрое приложение, потребляющее мало ресурсов, то язык ассемблера является очень серьезной альтернативой языкам высокого уровня. Кроме того, в любых сложных программах всегда существуют критические секции, требующие интенсивных и быстрых вычислений, которые придется разрабатывать не на языке высокого уровня, а на ассемблере.
Для разработки программ на ассемблере создана масса инструментальных средств, но мы будем использовать макроассемблер MASM фирмы Microsoft, включающий в себя несколько утилит. Выбор макроассемблера MASM в качестве среды разработки сделан исходя из следующих соображений:
– MASM является наиболее популярной средой программирования на ассемблере;
– последние версии макроассемблера MASM (7.10.хххх) позволяют работать с мультимедийными расширениями (SIMD), которые поддерживаются последними поколениями процессоров. Это является очень важным фактором, поскольку очень мало компиляторов ассемблера поддерживают эти технологии;
– соглашения и форматы файлов, принятые в MASM, поддерживаются большинством компиляторов языка ассемблера;
– стандарты и соглашения, принятые в MASM, полностью совместимы с теми, что приняты в наиболее популярных средах разработки (Microsoft Visual C++ .NET и Borland Delphi 2005). Это свойство позволяет включать скомпилированные макроассемблером объектные файлы в программы, разработанные на языках высокого уровня.
Популярный компилятор TASM, к сожалению, более не поддерживается, и его развитие закончилось несколько лет назад. Серьезным недостатком этого компилятора при всей его привлекательности является невозможность работы с современными архитектурами процессоров Intel, поддерживающими технологии параллельной обработки данных (SIMD).
Хочу уточнить, что мы будем создавать и анализировать программы и процедуры с использованием компилятора ассемблера версий не ниже 6.14.хххх, а при рассмотрении технологий SIMD —не ниже 7.10.хххх. Очень удобен для этих целей свободно распространяемый пакет программ MASM32, содержащий помимо компилятора версии 6.14 также редактор исходных текстов и несколько полезных утилит. На момент написания книги текущей версией MASM32 является 8.2.
Рассмотрим более подробно процесс ассемблирования программ с помощью макроассемблера MASM. Должен заметить, что ассемблирование программ
Пакет 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.