- •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. Удаление макроопределений
9.4.2. Команды циклического сдвига
Команды циклического сдвига, в отличие от команд сдвига, сохраняют сдвинутые за пределы операнда биты, помещая их обратно в операнд.
Как и при исполнении команд сдвига, сдвинутый за пределы операнда бит запоминается во флаге переноса CF.
Команды ROL (сдвинуть влево циклически) и ROR (сдвинуть вправо циклически). При исполнении команд вышедший за пределы операнда бит входит в него с противоположного конца.
Команды RCL (сдвинуть влево циклически вместе с флагом переноса) и RCR (сдвинуть вправо циклически вместе с флагом переноса). При исполнении команд в противоположный конец операнда помещается значение флага переноса CF.
Все команды циклического сдвига воздействуют только на флаги CF и OF.
Пример.
Пусть снова АL = 10110100 и CF = 1.
Команды циклического сдвига воздействуют на регистр AL и флаг CF следующим образом:
После ROL АL, l: AL = 01101001 CF = 1
После ROR AL, 1: AL = 01011010 CF = 0
После RCL AL, 1: AL = 01101001 CF = 1
После RCR AL, 1: AL = 11011010 CF = 0
10. Команды работы с флагами
10.1. Команды управления флагами
У микропроцессора 8088 есть семь команд, которые позволяют изменять флаг переноса CF, флаг направления DF и флаг прерывания IF.
Команды STC (установить флаг переноса) и CLC (обнулить флаг переноса) переводят флаг CF в состояния 1 и 0 соответственно. Они полезны для установки нужного состояния флага CF перед исполнением команд циклического сдвига с флагом переноса RCL и RCR.
Команда CMC (обратить флаг переноса) переводит флаг CF в состояние 0, если он имел состояние 1, и наоборот.
Команды STD (установить флаг направления) и CLD (обнулить флаг направления) переводят флаг DF в состояния 1 и 0 соответственно. Мы их рассматривали при изучении команд обработки строк.
Команда CLI (обнулить флаг прерывания) обнуляет флаг IF. Это заставляет микропроцессор 8088 игнорировать маскируемые прерывания, инициируемые внешними устройствами системы.
Команда STI (установить флаг прерываний) переводит флаг IF в состояние 1. Это что разрешает микропроцессору 8088 реагировать на прерывания, инициируемые внешними устройствами.
10.2. Команды пересылки флагов
Команда LAHF (загрузить регистр АН флагами) копирует флаги, совместимые с флагами микропроцессоров 8080/8085, в регистр АН. А именно, она копирует флаги CF, PF, AF, ZF и SF в соответствующие биты регистра АН (0, 2, 4, 6 и 7).
Команда SAHF (загрузить флаги из регистра АН) выполняет обратную операцию: она загружает пять упомянутых битов регистра АН в регистр флагов.
Команда LAHF не изменяет состояния флагов. Команда SAHF, конечно же, изменяет состояние флагов микропроцессоров 8080/8085. Эти команды введены для совместимости с микропроцессорами 8080/8085.
Команды PUSHF и POPF пересылают содержимое регистра флагов в стек и обратно. Они идентичны командам PUSH и POP, но в них не требуется указывать операнд, так как под ним подразумевается регистр флагов. Как и в случае команд PUSH и POP, команды PUSHF и POPF всегда используются парами.
С помощью команд PUSH, PUSHF, POP и POPF можно сохранить содержимое любого регистра (или даже всех регистров) на время исполнения процедуры или программы обработки прерывания.
Пример.
Пусть содержащиеся в регистрах AX и DI данные имеют существенное значение. Далее, пусть требуется обратиться к процедуре SORT, которая может изменить их содержимое. Предположим также, что только что была выполнена арифметическая операция и важно оставить флаги неприкосновенными.
Эту задачу выполнит следующая последовательность команд:
PUSH АX ; Сохранить регистры
PUSH DI
PUSHF ; и флаги
CALL SORT ; Вызвать процедуру
POPF ; По возвращению восстановить флаги
POP DI ; и регистры
POP AX
Можно также включить требуемые команды PUSH, PUSHF и POP, POPF в тело процедуры с тем, чтобы не повторять их при каждом обращении к ней. Следовательно, три команды PUSH должны стать первыми командами процедуры SORT, а три команды POP – ее последними командами. После этого можно указывать команду
CALL SORT
и не заботиться о том, какие регистры уничтожаются, а какие сохраняются.
