- •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.3. Псевдооператоры макроассемблера
Рассмотрим псевдооператоры, предусмотренные для задания макроопределений.
13.3.1. Псевдооператор local
Если тело макроопределения несколько раз подставлено в одну программу, в ней окажется несколько одноименных меток. В результате Вы столкнетесь с сообщениями об ошибках типа "символ многократно определен".
Таким образом, если макроопределение содержит помеченные команды или псевдооператоры, то необходимо указать Ассемблеру, чтобы он изменял метки при каждом расширении макроопределения. Сообщает Ассемблеру, какие метки должны изменяться при каждом расширении, псевдооператор LOCAL. Псевдооператор имеет формат
LOCAL [список формальных параметров]
Он заставляет Ассемблер создать уникальное имя для каждой метки из списка формальных параметров и подставить это имя при каждом вхождении метки в расширение макроопределения.
Пример.
Рассмотрим макроопределение, которое заставляет микропроцессор ожидать, пока значение COUNT не уменьшится до нуля.
WAIT MАCRO COUNT
LOCAL NEXT
PUSH CX ; Сохранить текущее значение CX
МOV CX, COUNT ; Поместить счетчик в CX
NEXT: LOOP NEXT ; Повторять, пока счетчик не обратится в 0
POP CX ;Восстановить исходное значение СХ
ENDM
Указание метки NEXT в операторе LOCAL позволяет нам пользоваться этим макроопределением в программе более одного раза.
Оператор LOCAL должен следовать непосредственно за оператором MACRO. Если требуется несколько операторов LOCAL, то они должны быть первыми операторами в макроопределении. Они должны предшествовать любому другому оператору и даже комментариям.
Указание метки в операторе LOCAL также означает, что можно использовать такую же метку в других макроопределениях. Ассемблер дает ей новое внутреннее имя всякий раз, когда расширяет макроопределение; таким образом дублирование меток исключается.
13.3.2. Псевдооператоры повторения
Псевдооператоры повторения заставляют Ассемблер повторить в макроопределении последовательность операторов на языке ассемблера.
Псевдооператор REPT имеет формат:
REPT выражение
. . .
ENDM
Он получает свой счетчик числа повторений из выражения, указанного в поле операнда.
Пример.
Следующее макроопределение зарезервирует LENGTH байтов памяти и присвоит им в качестве начальных значений числа от 1 до LENGTH:
ALLOCATE MACRO TLABEL, LENGTH
TLABEL EQU THIS BYTE
VALUE = 0
REPT LENGTH
VALUE = VALUE + 1
DB VALUE
ENDМ
ENDM
Обратите внимание на то, что здесь нам понадобились два оператора ENDM: одним отмечен конец действия псевдооператора REPT, а другим – конец макроопределения.
После задания макроопределения ALLOCATE им можно воспользоваться для создания 40-байтовой таблицы TABLE1, указав такую последовательность операторов:
DATA SEGMENT PARA DATA
ALLOCATE TABLE1, 40
DATA ENDS
Псевдооператор повторения IRP имеет формат:
IRP параметр, < список аргументов >
. . .
ENDM
Он заставляет Ассемблер повторять находящиеся между псевдооператорами IRP и ENDM операторы по одному разу для каждого аргумента списка. При каждом повторении производится подстановка очередного аргумента вместо каждого вхождения параметра в блок операторов.
Пример. Последовательность операторов
IRP VALUE , < 1, 2, 3, 5, 7 >
DW VALUE*VALUE*VALUE
ENDM
создаст таблицу из 5 слов, содержащую кубы первых 5 простых чисел.
Псевдооператор IRPC похож на псевдооператор IRP, но его аргументами являются не числа, а строковые переменные. Формат:
IRPC параметр, строка
. . .
ENDM
Он заставляет Ассемблер повторять находящиеся между псевдооператорами IRPC и ENDM операторы по одному разу для каждого символа строки. При каждом повторении производится подстановка очередного символа строки вместо каждого вхождения параметра в блок операторов.
Пример.
Последовательность операторов
IRPC CHAR, 01234
DB CHAR
ENDM
создает в памяти 5-байтовую строку символов, содержащую ASCII-коды цифр от 0 до 4.
