- •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. Удаление макроопределений
12. Условные псевдооператоры
Условные псевдооператоры заставляют Ассемблер либо транслировать, либо пропускать группу исходных операторов в зависимости от того, "истинно" или "ложно" в момент трансляции определенное условие.
Эта избирательная возможность "транслировать/не транслировать" позволяет:
– помещать в текст программы диагностические или специальные условия на случай тестовых прогонов,
– создавать специфические версии многоцелевой программы.
Для обеспечения условной трансляции порции текста программы необходимо перед ней поставить псевдооператор IF, а после нее –псевдооператор ENDIF.
Если условие в псевдооператоре IF окажется "истинным", то операторы, расположенные между IF и ENDIF, будут транслироваться.
Если условие окажется "ложным", то эти операторы будут пропущены и трансляция продолжится с оператора, следующего после ENDIF.
Сгруппируем восемь видов псевдооператора IF в четыре пары.
1. IFE и IF. Формат
IFE выражение
IF выражение
IFE дает значение "истинно", если выражение равно 0;
IF дает значение "истинно", если выражение не равно 0.
2. IF1 и IF2. Операндов у псевдооператоров нет.
IF1 дает значение "истинно", если Ассемблер выполняет первый проход.
IF2 дает значение "истинно", если Ассемблер выполняет второй проход.
3. IFDEF и IFNDEF. Формат
IFDEF идентификатор
IFNDEF идентификатор
IFDEF дает значение "истинно", если идентификатор определен или объявлен как внешний псевдооператором EXTRN;
IFNDEF дает значение "истинно" в противном случае.
4. IFIDN и IFIDF. Формат
IFIDN < строка1 > < строка2 >
IFIDF < строка1 > < строка2 >
Угловые скобки необходимы.
IFIDN дает значение "истинно", если строки строка1 и строка2 идентичны; IFIDF дает значение "истинно", если они различаются.
Пример.
Для включения диагностических процедур в тестовый прогон окаймите их псевдооператорами IFE и ENDIF и определите константу FOR_TEST_ONLY. Во время трансляции Ассемблер проверит ее значение. Если это значение окажется ненулевым, то диагностические процедуры будут пропущены.
Программа будет выглядеть следующим образом:
IFE FOR_TEST_ONLY
DIAG1: . . . (Диагностические команды)
ENDIF
Команды между меткой DIAG1 и оператором ENDIF будут оттранслированы только в том случае, если ранее в программу был помещен оператор
FOR_TEST_ONLY = 0
А оператор
FOR_TEST_ONLY = 1
предпишет Ассемблеру пропустить команды, находящиеся между меткой DIAG1 и оператором ENDIF.
Признак альтернативы
Предположим, что условие оказалось "ложным". Альтернативную группу команд можно включить в программу с помощью признака альтернативы ELSE (иначе). В общем случае он имеет следующий формат:
IFxx [аргумент]
. . . (Операторы для "истинного" значения условия)
ELSE
. . . (Операторы для "ложного" значения условия)
ENDIF
Пример.
Признак альтернативы ELSE позволяет создать две версии программы, одна из которых будет выдавать приглашение к вводу и сообщения на английском языке, а другая – на русском.
Для этого можно определить константу LANGUAGE, которая позволит выбрать операторы, требуемые для соответствующего языка. Если ее значение равно 0, то Ассемблер создает английскую версию; если равно 1 – русскую.
Связанный с текстом сообщений раздел программы может иметь следующий вид:
IFE LANGUAGE
. . . (Операторы английской версии)
ELSE
. . . (Операторы русской версии)
ENDIF
Вложенные условные псевдооператоры
Можно определить для Ассемблера более двух вариантов трансляции с помощью вложения условных псевдооператоров.
Пример.
Предположим, что русская версия нашей программы действительно заработала. Теперь нужно сделать другие версии, которые выдают сообщения и приглашения к вводу на французском и немецком языках.
Для этого модифицируем программу так, чтобы Ассемблер выбирал язык по значениям 0, 1, 2 и 3 константы LANGUAGE (соответственно английский, русский, французский или немецкий). В этом случае раздел сообщений может иметь следующий вид:
IFE LANGUAGE
. . . (Операторы для выдачи сообщений на английском языке)
ELSE
IFE LANGUAGE–1
. . . (Операторы для выдачи сообщений на русском языке)
ELSE
IFE LANGUAGE–2
. . . (Операторы для выдачи сообщений на французском языке)
ELSE
. . . (Операторы для выдачи сообщений на немецком языке)
ENDIF
ENDIF
ENDIF
