- •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.3. Условные псевдооператоры
При наличии этих псевдооператоров Ассемблер проверяет, удовлетворяется ли определенное условие. Если да, то он транслирует определенную группу операторов, если нет, он пропускает их. В данной конструкции используются известные Вам псевдооператоры IFхх и ENDIF. Для указания альтернативных действий используется псевдооператор ELSE.
Здесь могут использоваться все условные псевдооператоры, которые мы уже рассмотрели, а также два дополнительных псевдооператора – IFВ и IFNB.
Псевдооператор IFВ
Псевдооператор IFВ (если пустой). Формат:
IFB < аргумент >
. . .
ENDIF
Действия выполняются, если < аргумент > пуст. Угловые скобки обязательны.
Если Вы указали меньше параметров, чем это сделано при задании макроопределения, то Ассемблер присвоит опущенным (или пустым) параметрам нулевые значения.
Оператор IFB позволяет указать альтернативные способы обработки пустых параметров. Обычно он используется, чтобы заставить макроопределения завершиться раньше в том случае, если какие-либо необходимые ему параметры отсутствуют.
Псевдооператор IFNB
Псевдооператор IFNB (если не пустой). Формат:
IFNB < аргумент >
. . .
ENDIF
Действия выполняются, если < аргумент > не пуст. Угловые скобки обязательны.
Когда Ассемблер обнаруживает псевдооператор IFNB, то он транслирует связанные с ним команды только в том случае, если пользователь дал значение параметру; в противном случае он пропускает их.
Пример.
Макроопределение, считывающее имя, отчество и фамилию может быть рассчитано на то, что Вы будете вызывать его следующим образом:
GET_NAME NAME1, NAME2, NAME3
Макроопределение GET_NAME должно включать команды, которые получают соответственно имя, отчество, а затем фамилию. Однако отчество не всегда известно, и поэтому надо предусмотреть возможность его отсутствия.
Это можно сделать с помощью псевдооператора IFNB. Он даст возможность включить команды получения отчества только в том случае, если пользователь задал соответствующий параметр. Следовательно, макроопределение GET_NAME должно иметь следующий общий вид:
GET_NAME MACRO NAME1, NAME2, NAME3
. . . (Эти команды считывают имя)
IFNB < NAME2 >
. . . (Эти команды считывают отчество)
ENDIF
. . . (Эти команды считывают фамилию)
ENDM
После этого можно воспользоваться формой оператора вида
GET_NAME Джон,, Браун
Псевдооператор IFNB может также помочь избежать ошибок трансляции, которые возникают из-за отсутствия операндов.
Пример.
Пусть макроопределение включает оператор
PUSH register
и при его вызове опускается в списке параметров параметр register.
Тогда Ассемблер попытается оттранслировать этот оператор как
PUSH 0
Это, конечно, недопустимо. Чтобы избежать подобных ситуаций, используйте операторы
IFNB < register >
PUSH register
ENDIF
Для последующего оператора POP понадобится принять аналогичные предосторожности.
13.3.4. Псевдооператор eхiтм
Псевдооператор EXITM (выйти из макроопределения) заставляет Ассемблер завершить расширение макроопределения до его окончания в зависимости от результата условного псевдооператора.
Пример.
IFB <name>
EXITM
ENDIF
