- •1. Предварительные сведения 6
- •2. Процессоры intel в реальном режиме 11
- •3. Директивы и операторы ассемблера 51
- •Введение
- •1. Предварительные сведения
- •1.1. Подготовка программ на языке ассемблера
- •1.2. Представление данных в компьютерах
- •1.2.1. Двоичная система счисления
- •1.2.2. Биты, байты и слова
- •1.2.3. Шестнадцатеричная система счисления
- •1.2.4. Числа со знаком
- •1.2.5. Логические операции
- •1.2.6. Коды символов
- •2. Процессоры intel в реальном режиме
- •2.1. Регистры процессора
- •2.1.1. Регистры общего назначения
- •2.1.2. Модели памяти и сегментные регистры
- •2.1.3. Стек
- •2.1.4. Регистр флагов
- •2.2.4. Косвенная адресация
- •2.2.5. Адресация по базе со смещением
- •2.2.6. Косвенная адресация с масштабированием
- •2.2.7. Адресация по базе с индексированием
- •2.2.8. Адресация по базе с индексированием и масштабированием
- •2.3. Основные непривилегированные команды
- •2.3.1. Пересылка данных
- •2.3.2. Двоичная арифметика
- •2.3.3. Десятичная арифметика
- •2.3.4. Логические операции
- •2.3.5. Сдвиговые операции
- •2.3.6. Операции над битами и байтами
- •2.3.7. Команды передачи управления
- •2.3.8. Строковые операции
- •2.3.9. Управление флагами
- •2.3.10. Загрузка сегментных регистров
- •2.3.11. Другие команды
- •3. Директивы и операторы ассемблера
- •3.1. Структура программы
- •3.2. Директивы распределения памяти
- •3.2.1. Псевдокоманды определения переменных
- •3.2.2. Структуры
- •3.3. Организация программы
- •3.3.1. Сегменты
- •3.3.2. Модели памяти и упрощенные директивы определения сегментов
- •3.3.4. Процедуры
- •3.3.5. Конец программы
- •3.3.6. Директивы задания набора допустимых команд
- •3.3.7. Директивы управления программным счетчиком
- •3.3.8. Глобальные объявления
- •3.3.9. Условное ассемблирование
- •3.4. Выражения
- •3.5. Макроопределения
- •3.5.1. Блоки повторений
- •3.5.2. Макрооператоры
- •3.5.3. Другие директивы, используемые в макроопределениях
- •3.6. Другие директивы
- •3.6.1. Управление файлами
- •3.6.2. Управление листингом
- •3.6.3. Комментарии
- •Литература
1. Предварительные сведения
1.1. Подготовка программ на языке ассемблера
Как уже отмечалось, язык ассемблера отражает архитектурные особенности компьютера. Для каждого семейства компьютеров используется свой язык ассемблера и свои программы для обработки исходного текста ассемблерных программ. Здесь рассматривается язык ассемблера для семейства персональных IBM-совместимых компьютеров (IBM PC), получивших сегодня повсеместное распространение. Компьютеры IBM-PC базируются на микропроцессорах семейства x86, выпускаемых фирмой Intel и конкурирующими компаниями. Однако и здесь существует несколько разных версий ассемблеров, разработанных различными производителями программного обеспечения. Среди выпущенных пакетов ассемблеров наиболее популярными являются TASM фирмы Borland и MASM фирмы Microsoft.
Исходный текст программы на языке ассемблера представляет собой "чистый" текстовый файл (содержащий неформатированный текст) с расширением ASM. Для обработки исходного текста используется как минимум две программы: непосредственно ассемблер, переводящий мнемонические команды процессора в машинный код (объектный файл определенного формата с расширением OBJ), и компоновщик (редактор связей), преобразующий OBJ-файл в исполнимый модуль (EXE или COM), а также объединяющий несколько объектных модулей, если они указаны. Помимо этого для разных целей могут потребоваться дополнительные вспомогательные программы — компиляторы ресурсов, расширители DOS и т. п.
При трансляции программы ассемблер проверяет исходный текст на наличие синтаксических и фазовых ошибок. Синтаксические ошибки возникают при использовании неописанных идентификаторов, ошибочном написании ключевых слов, несоответствии использованных типов операндов и в других случаях. Фазовые ошибки возникают при неверной сегментной адресации переменных и в некоторых других случаях, обычно связанных с проходами трансляции. При наличии в программе ошибок ассемблер не генерирует объектный код и выдает на экран сообщения об ошибках.
Запуском программы-ассемблера с определенными ключевыми параметрами можно инициировать создание файла-листинга. Листинг представляет собой текстовый файл с расширением LST, содержащий исходный текст программы с указанием номеров строк, относительных адресов команд и данных, машинное представление команд и данных (в 16-ричной системе счисления), список свойств переменных, меток и сегментов, сообщения об ошибках и прочую служебную информацию. Файл листинга разбивается на страницы, снабжается колонтитулами и управляющими кодами принтера (для управления разбиением можно использовать директивы PAGE и TITLE) и, таким образом, подготовлен для печати в текстовом режиме принтера.
В случае использования некоторых зарезервированных слов языка в качестве имен идентификаторов ассемблер выдает предупреждение, но, тем не менее, создает объектный файл. Рекомендуется исправить несоответствия, отмеченные ассемблером, и лишь затем приступать к обработке объектного файла — компоновке.
На этапе компоновки происходит связывание отдельных частей программы в единый исполнимый модуль. Формат этого модуля зависит от используемой операционной системы. В MS-DOS используется два различных формата исполнимых модулей — EXE и COM. Во время обработки объектного кода программа-компоновщик проверяет правильность размещения данных в сегментах, наличие стека и другие особенности объектного модуля, часть из которых зависит от формата создаваемого исполнимого файла (EXE или COM). При наличии некритичных несоответствий, например, при отсутствии стека, компоновка файлов все же может выполниться, тогда на экран будут выданы соответствующие предупреждения.
Кроме грубых синтаксических ошибок, фиксируемых на этапе трансляции и компоновки, в программе могут встречаться логические ошибки (ошибки в алгоритме программы или несоответствия алгоритму, отсутствие необходимых действий или проверок и т. п.), приводящие к неправильному функционированию готового исполнимого модуля. Для выявления таких ошибок в состав пакетов ассемблеров, как правило, входит программа-отладчик. В ее задачу входит обеспечение пошагового или поблочного выполнения программы, отображение текста программы в машинном и ассемблерном форматах с указанием адресов размещения команд и данных в памяти, отображение и возможность модификации содержимого регистров процессора и областей оперативной памяти. Обычно отладчик позволяет также дизассемблировать программу в машинном коде, то есть, не имея исходного текста, преобразовывать машинный код в последовательность мнемонических команд языка ассемблера.