- •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. Удаление макроопределений
5.4. Команды управления циклами
Команды управления циклами обеспечивают условные передачи управления при организации циклов. У микропроцессора 8088 регистр счетчика СХ служит счетчиком числа повторений циклов. Каждая команда управления циклами уменьшает содержимое регистра СХ на 1, а затем использует его новое значение для "принятия решения" о выполнении или не выполнении перехода.
Основная команда этой группы LOOP (повторять цикл до конца счетчика) имеет формат
LOOP близкая_метка
Она уменьшает содержимое регистра СХ на 1 и передает управление операнду близкая_метка, если содержимое регистра СХ не равно 0. Например, для стократного выполнения определенной группы команд можно воспользоваться следующей конструкцией:
MOV СХ, 100 ; Загрузить число повторений в СХ
START: ... ; Повторяемая группа команд
LOOP START ; Если СХ не равен 0, перейти к метке START,
; в противном случае выйти из цикла
Команда LOOP завершает выполнение цикла только в том случае, если содержимое регистра СХ уменьшено до 0. Однако во многих приложениях требуются такие циклы, которые должны завершаться при выполнении определенных условий до того, как содержимое регистра СХ достигнет нуля. Такое альтернативное завершение цикла обеспечивается командой LOOPE (повторять цикл, если равно), имеющей синоним LOOPZ (повторять цикл, если нуль), и командой LOOPNE (повторять цикл, если не равно), имеющей синоним LOOPNZ (повторять цикл, пока не нуль).
Команда LOOPE:
– уменьшает содержимое регистра СХ на 1,
–осуществляет переход, если содержимое регистра СХ не равно 0 и флаг нуля ZF равен 1.
Таким образом, повторение цикла завершается, если:
– либо содержимое регистра СХ равно 0,
– либо флаг ZF равен 0,
– либо оба они равны 0.
Обычно команда LOOPE используется для поиска первого ненулевого результата в серии операций.
Команда LOOPNE:
– уменьшает содержимое регистра СХ на 1,
– осуществляет переход, если содержимое регистра СХ не равно 0 и флаг нуля ZF равен 0.
Таким образом, повторение цикла завершается, если:
– либо содержимое регистра СХ равно 0,
– либо флаг ZF равен 1,
– либо будет выполнено и то, и другое.
Обычно команда LOOPNE используется для поиска первого нулевого результата в серии операций.
Пример. В регистре ВХ содержится адрес начала таблицы байтов.
NEXT: INC ВХ ; Передвинуть указатель к следующей
СМР [ ВХ ], 0 ; ячейке и сравнить ее с 0
LOOPE NEXT ; Перейти к сравнению следующего
; байта
JNZ NZ ; Найден ненулевой байт
... ; Нет.
NZ: ... ; Да.
INC – команда увеличения на единицу.
6. Команды обработки строк
Команды обработки строк позволяют производить действия над блоками байтов или слов памяти. Эти блоки (или строки) могут иметь длину до 64 Кбайт и состоять из числовых или алфавитно-цифровых значений (типа символов в кодах ASCII).
Команды обработки строк предоставляют возможность выполнения пяти основных операций, называемых примитивами, которые обрабатывают строку по одному элементу (байту или слову) за прием.
Микропроцессор 8088 предполагает, что строка-приемник находится в дополнительном сегменте, а строка-источник – в сегменте данных. Процессор адресует строку-приемник через регистр DI, а строку-источник – через регистр SI.
Перед выполнением команд необходимо обеспечить, чтобы эти регистры содержали смещение первых обрабатываемых элементов обеих строк относительно начала соответствующего сегмента.
Это можно сделать с помощью команды LEA (загрузить исполнительный адрес). Команда LEA пересылает смещение ячейки памяти в любой 16-битовый регистр общего назначения, регистр указателя или индексный регистр. Она имеет формат
LEA регистр, память
Пример. Если в сегменте данных описана строка SOURCE, а в дополнительном сегменте – строка DEST, то необходимы действия
LEA SI, SOURCE
LEA DI, DEST
Возможно ли, чтобы обе обрабатываемые строки находились в одном сегменте: сегменте данных или в дополнительном сегменте?
Это возможно, но необходимо задать корректные значения сегментных регистров ES и DS.
Если обе строки находятся в сегменте данных, то необходимо в регистр ES поместить адрес начала сегмента данных, т.е. значение, находящееся в регистре DS. Тогда процессор будет думать, что он обращается к дополнительному сегменту, а на самом деле будет обращаться к сегменту данных.
Пример. Строки SOURCE и DEST находятся в сегменте данных.
PUSH DS ; Заставить ES указывать на сегмент
POP ES ; данных
Аналогично, если же обе строки находятся в дополнительном сегменте, то необходимо в регистр DS поместить адрес начала дополнительного сегмента, т.е. значение, находящееся в регистре ES.
Так как команды манипулирования строками предназначены для действий над группой элементов, то они автоматически модифицируют указатели для адресации следующего элемента строки.
Бит флага направления DF в регистре флагов определяет, будут значения регистров SI и DI увеличены или уменьшены по завершении выполнения команды. Если флаг DF равен 0, то значения регистров SI и DI увеличиваются после исполнения каждой команды. Если флаг DF равен 1, то они уменьшаются.
Состоянием флага DF можно управлять с помощью двух команд: CLD – сбросить флаг направления, которая полагает его равным нулю, и STD – установить флаг направления, которая присваивает ему значение 1.
