- •1. Внутренние регистры
- •1.1. Регистры данных
- •1.2. Регистры сегментов
- •1.3. Регистры указателей и индексов
- •1.4. Регистр командного указателя
- •1.5. Флаговый регистр
- •2. Структура и процесс разработки программы на языке ассемблера
- •2.1. Команды
- •2.2. Псевдооператоры
- •2.2.1. Псевдооператор segment
- •2.2.2. Псевдооператор proc
- •2.2.3. Псевдооператор assume
- •2.2.4. Псевдооператор end
- •2.2.5. Псевдооператоры определения данных
- •2.3. Инициализация программы
- •3. Команды пересылки данных
- •3.1. Команда mov
- •3.2. Команды push и рор
- •4. Режимы адресации
- •4.1. Регистровая и непосредственная адресация
- •4.2. Исполнительный адрес
- •4.3. Прямая адресация
- •4.4. Косвенная регистровая адресация
- •4.5. Адресация по базе
- •4.6. Прямая адресация с индексированием
- •4.7. Адресация по базе с индексированием
- •5. Команды передачи управления
- •5.1. Команды call и ret
- •5.2. Команда безусловного перехода jmp
- •5.3. Команды условной передачи управления
- •5.4. Команды управления циклами
- •6. Команды обработки строк
- •6.1. Команды пересылки строк movs, movsb, movsw
- •6.2. Префиксы повторения
- •6.3. Команды сравнения строк. Команда cmps.
- •6.4. Команды сканирования строк
- •6.5. Команды загрузки и сохранения строки
- •7. Взаимодействие языков Си и Ассемблера
- •7.1. Внутренняя структура программы на языке Си для ibm pc
- •7.2. Использование функций на языке Ассемблера
- •7.2.1. Основы взаимодействия языков Си и Ассемблера
- •7.2.2. Передача управления в подпрограмму и обратно
- •7.2.3. Использование глобальных данных
- •7.2.4. Использование аргументов функции
- •7.2.5. Возвращение значения через имя подпрограммы
- •7.2.6. Использование аргументов
- •7.3. Вызов функций на языке Си из программ на языке Ассемблера
- •7.4. Использование локальных данных
- •8. Арифметические команды
- •8.1. Форматы хранения десятичных чисел
- •8.2. Команды сложения
- •8.3. Коррекция результата сложения для bcd-форматов
- •8.4. Команда приращения значения приемника на единицу
- •8.5. Команды вычитания
- •8.6. Коррекция результата вычитания для bcd-форматов
- •8.7. Команда уменьшения содержимого приемника на единицу
- •8.8. Команда обращения знака
- •8.9. Команды умножения
- •8.10. Коррекция результатов умножения
- •8.11. Команды деления
- •8.12. Коррекция результатов деления
- •8.13. Команды расширения знака
- •9. Команды манипулирования битами
- •9.1. Логические команды and, or и xor
- •9.2. Команда логического отрицания nот
- •9.3. Команда проверки test
- •9.4. Команды сдвига и циклического сдвига
- •9.4.1. Команды сдвига
- •9.4.2. Команды циклического сдвига
- •10. Команды работы с флагами
- •10.1. Команды управления флагами
- •10.2. Команды пересылки флагов
- •11. Псевдооператоры определения идентификаторов и операции
- •11.1. Псевдооператоры определения идентификаторов
- •11.2. Операции
- •11.2.1. Арифметические операции
- •11.2.2. Логические операции
- •11.2.3. Операции отношения
- •11.2.4. Операции, возвращающие значения
- •11.2.5. Операции присваивания атрибутов
- •12. Условные псевдооператоры
- •13. Макроопределения
- •13.1. Сравнение макроопределений и процедур
- •13.2. Состав макроопределений
- •13.3. Псевдооператоры макроассемблера
- •13.3.1. Псевдооператор local
- •13.3.2. Псевдооператоры повторения
- •13.3.3. Условные псевдооператоры
- •13.3.4. Псевдооператор eхiтм
- •13.4. Операции в макроопределениях
- •13.5. Задание макроопределений в исходных программах
- •13.5.1. Использование библиотеки макроопределений
- •13.5.2. Указания для задания макроопределений
- •13.5.3. Считывание библиотеки макроопределений в программу
- •13.5.4. Удаление макроопределений
13. Макроопределения
Макроопределения подобны подпрограммам и представляют собой "мини-программы", которые можно несколько раз вставлять в исходные программы. Макроопределения являются последовательностью операторов на языке ассемблера (команд и псевдооператоров). После того как макроопределение задано, его имя можно использовать в исходной программе вместо соответствующей последовательности команд.
13.1. Сравнение макроопределений и процедур
И макроопределения, и процедуры предоставляют возможность краткой ссылки на часто используемую последовательность команд. Однако, между ними существует и различие.
Коды команд процедуры входят в программу однократно, и микропроцессор передает им управление по мере необходимости.
Коды команд макроопределения могут встречаться в программе неоднократно. Ассемблер заменяет каждое упоминание имени макроопределения на те команды, которые оно представляет, т.е. Ассемблер "расширяет" макроопределение.
Следовательно, при исполнении программы микропроцессор исполняет команды макроопределения "непосредственно", не передавая управление в другое место памяти. Таким образом, имя макроопределения представляет собой директиву Ассемблера; оно служит командой Ассемблеру, а не микропроцессору.
По сравнению с процедурами макроопределения имеют три преимущества:
1. Макроопределения динамичны. За счет изменения входных параметров макроопределения можно изменить не только объекты, которыми оно манипулирует, но и выполняемые над ними действия. Напротив, в случае процедуры можно изменять только передаваемые ей данные. Это делает процедуры гораздо менее гибкими.
2. Применение макроопределений вместо процедур ускоряет исполнение программ, так как микропроцессору не надо отвлекаться на выполнение команд вызова процедуры и возврата из нее.
3. Макроопределения можно ввести в библиотеку, из которой программист может извлекать их при составлении других программ.
Однако макроопределения имеют основной недостаток, которого лишены процедуры: при их применении объектные программы становятся длиннее, поскольку макроопределения расширяются при каждом их появлении и память заполняется повторяющимися последовательностями команд.
13.2. Состав макроопределений
Каждое макроопределение имеет три части:
1. Заголовок – псевдооператор MACRO. Формат:
имя MACRO [список формальных параметров]
Псевдооператор присваивает имя последовательности операторов языка ассемблера. В поле метки указано имя макроопределения, а в поле операнда – необязательный список формальных параметров. В списке формальных параметров указываются переменные – входные параметры, которые можно изменять при каждом вызове макроопределения.
2. Тело – последовательность операторов Ассемблера (команд и псевдооператоров), которые задают действия, выполняемые макроопределением.
3. Концевик – псевдооператор ENDM, который отмечает конец макроопределения.
Пример. Макроопределение для сложения значений размером в слово:
ADD_WORDS MACRO TERM1, TERM2, SUM
MOV AX, TERM1
ADD AX, TERM2
MOV SUM, AX
ENDM
Для Ассемблера безразлично, что будет указано в качестве операндов макроопределения: имена регистров, ячейки памяти или непосредственные значения. Конечно, непосредственное значение нельзя использовать в качестве операнда SUM. Если окончательный результат имеет допустимую форму, то Ассемблер выполняет подстановку операндов.
Пример. Можно сложить содержимое двух ячеек памяти с помощью оператора
ADD_WORDS PRICE, ТАХ, COST
Вместо этого оператора Ассемблер вставит в программу следующие команды:
МOV АX, PRICE
АDD AX, TAX
MOV COST, AX
Можно сложить содержимое двух регистров, указав оператор
ADD_WORDS BX, CX, DX
На этот раз Ассемблер вставит команды
MOV АХ, ВХ
ADD АХ, СХ
MOV DX, AX
