- •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. Комментарии
- •Литература
3.5.2. Макрооператоры
Макрооператор «&» (амперсанд) используется для того, чтобы параметр, переданный в качестве операнда макроопределению или блоку повторений, заменялся на значение до обработки строки ассемблером. Так, например, следующий макрос выполнит команду PUSH EAX, если его вызвать как PUSHREG А:
pushreg macro letter
push e&letter&x
endm
Иногда можно использовать только один амперсанд — в начале параметра, если не возникает неоднозначностей, например, если передается номер, а требуется создать набор переменных с именами, оканчивающимися этим номером:
irp number, <1,2,3,4>
msg&number db ?
endm
Макрооператор «<>» (угловые скобки) действует так, что весь текст, включенный в эти скобки, рассматривается как текстовая строка, даже если он содержит пробелы или другие разделители. Как мы уже видели, этот макрооператор используется при передаче текстовых строк в качестве параметров для макросов. Другое частое применение угловых скобок — передача списка параметров вложенному макроопределению или блоку повторений.
Макрооператор «!» (восклицательный знак) используется аналогично угловым кавычкам, но действует только на один следующий символ, так что, если этот символ — запятая или угловая скобка, он все равно будет передан макросу как часть параметра.
Макрооператор «%» (процент) указывает, что следующий за ним текст является выражением и должен быть вычислен. Обычно это используется для того, чтобы передавать в качестве параметра в макрос не само выражение, а его результат.
Макрооператор «;;» (две точки с запятой) — начало макрокомментария. В отличие от обычных комментариев текст макрокомментария не попадет в текст программы при подстановке макроса и не попадает в листинг. Это сэкономит память при ассемблировании программы с большим количеством макроопределении.
3.5.3. Другие директивы, используемые в макроопределениях
Директива EXITM выполняет преждевременный выход из макроопределения или блока повторений. Например, следующее макроопределение не выполнит никаких действий, то есть не будет расширено в команды процессора, если параметр не указан:
pushreg macro reg
ifb <reg>
exitm
endif
push reg
endm
LOCAL метка... — перечисляет метки, которые будут использоваться внутри макроопределения, чтобы не возникало ошибки «метка уже определена» при использовании макроса более одного раза или если та же метка присутствует в основном тексте программы. Операнд для LOCAL — метка или список меток, которые будут использоваться в макросе.
PURGE имя_макроса — отменяет определенный ранее макрос. Эта директива часто применяется сразу после INCLUDE, включившей в текст программы файл с большим количеством готовых макроопределений.
3.6. Другие директивы
3.6.1. Управление файлами
INCLUDE имя_файла — директива, вставляющая в текст программы текст файла. Обычно используется для включения файлов, содержащих определения констант, структур и макросов.
INCLUDELIB имя_файла — директива, указывающая компоновщику имя дополнительной библиотеки или объектного файла, который потребуется при компоновке данной программы. Например, если используются вызовы процедур или обращение к данным, определенным в других модулях. Использование этой директивы позволяет не указывать имена дополнительных библиотек при вызове компоновщика.