- •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.2. Команда безусловного перехода jmp
Команда JMP (перейти безусловно) представляет собой эквивалент на языке ассемблера оператора GOTO; она заставляет микропроцессор извлечь новую команду не из следующей ячейки памяти, а из какой-то другой.
Команда JMP имеет формат
JMP имя
где операнд имя подчиняется тем же правилам, что и операнд команды CALL. Иначе говоря, он может иметь атрибут NEAR или FAR, быть прямым или косвенным.
При прямом переходе команда JMP занимает три байта, если метка имя имеет атрибут NEAR, и пять байтов, если она имеет атрибут FAR. Например, команда
JMP М1
занимает три байта, если метка М1 находится в том же сегменте, или пять байтов, если она находится в другом сегменте.
Если адрес метки находится не далее -128 или +127 байтов от адреса команды JMP, то можно сделать команду JMP двухбайтовой. Для этого необходимо указать, что ее операнд имеет тип SHORT (короткий). Например, команда
JMP SHORT NEАR_LABEL
займет два байта. Она исполняется за то же время, что и команда
JMP NEAR_LABEL
но занимает в памяти на один байт меньше.
5.3. Команды условной передачи управления
У микропроцессора 8088 есть 17 различных команд, которые позволяют ему "принять решение" о ходе исполнения программы в зависимости от определенных условий. Например в зависимости от нулевого значения регистра или единичного значения какого-либо флага. Если такое условие выполнено, то микропроцессор выполнит переход. В противном случае он продолжит исполнение со следующей команды программы.
Команды условной передачи управления имеют следующий общий формат:
Jx близкая_метка
где х – модификатор, состоящий из одной, двух или трех букв. Запись операнда близкая_метка подчеркивает, что метка перехода должна находиться не далее –128 или +127 байтов от команды условной передачи управления.
Для знаковых и беззнаковых данных предназначены разные команды. Беззнаковые данные используют все биты как биты данных; например, символьные строки (имена), адреса и натуральные числа. В знаковых данных самый левый бит представляет собой знак.
Переходы для беззнаковых данных.
Код Описание Флаги
JE/JZ Переход, если равно/нуль ZF=1
JNE/JNZ Переход, если не равно/не нуль ZF=0
JA/JNBE Переход, если выше/не ниже или равно ZF=0 и CF=0
JAE/JNB Переход, если выше или равно/не ниже CF=0
JB/JNAE Переход, если ниже/не выше или равно CF=1
JBE/JNA Переход, если ниже или равно/не выше CF=1 или ZF=1
Любую проверку можно кодировать одним из двух мнемонических кодов. Например, JB и JNAE генерирует один и тот же объектный код.
Переходы для знаковых данных
Код Описание Флаги
JE/JZ тоже тоже
JNE/JNZ тоже тоже
JG/JNLE Переход, если больше/не меньше или равно ZF=0 и SF=OF
JGE/JNL Переход, если больше или равно/не меньше SF=OF
JL/JNGE Переход,
если меньше/не больше или равно SF
OF
JLE/JNG Переход, если меньше или равно/не больше ZF=1 или SF OF
Специальные арифметические проверки
Код Описание Флаги
JS Переход, если есть знак (отрицательно) SF=1
JNS Переход, если нет знака (положительно) SF=0
JC Переход, если есть перенос СF=1
JNC Переход, если нет переноса CF=0
JО Переход, если есть переполнение OF=1
JNO Переход, если нет переполнения OF=0
JP/JPE Переход, если сумма битов четная PF=1
JNP/JP Переход, если сумма битов не четная PF=0
JCXZ Переход, если в регистре СХ нуль СХ=0
Команды условной передачи управления занимают в памяти два байта: первый байт содержит код операции, а второй – относительный сдвиг. Если происходит переход, то исполнение этих команд занимает в четыре раза больше времени, чем в случае, когда перехода нет. Поэтому при составлении программы старайтесь подбирать такие команды условной передачи управления, при которых переход менее вероятен.
Командам условной передачи управления могут предшествовать любые команды, изменяющие состояния флагов, но обычно они используются совместно с командой сравнения СМР:
СМР приемник, источник.
Команда СМР вычитает операнд-источник из операнда-приемника и в зависимости от результата устанавливает или обнуляет флаги.
Условие |
Операнды со знаком (без знака) |
|
|
ZF |
SF (CF) |
источник <приемник |
0 |
0 |
источник =приемник |
1 |
0 |
источник >приемник |
0 |
1 |
Рассмотрим, какими условными переходами надо пользоваться при возможных сочетаниях значений источника и приемника.
Условие перехода |
Следующая за СМР команда |
|
|
для чисел без знака |
для чисел со таком |
Приемник больше источника |
JA |
JG |
Приемник равен источнику |
JE |
JE |
Приемник не равен источнику |
JNE |
JNE |
Приемник меньше источника |
JB |
JL |
Приемник меньше источника или равен ему |
JBЕ |
JLE |
Приемник больше источника или равен ему |
JAE |
JGE |
Приведем примеры.
1. Последовательность команд
СМР АL, BL
JE ZERO
осуществляет переход к метке ZERO, если значения регистров AL и BL одинаковы.
2. Рассмотрим ситуацию выбора между двумя различными командами условного перехода в зависимости от того, проверяется результат операции над числами без знака или над числами со знаком. Предположим, что требуется перейти к метке BXM, если содержимое регистра ВХ имеет большее значение, чем содержимое регистра АХ. Тогда надо использовать последовательность команд
СМР ВХ, АХ
JА BXM
если операнды не имеют знака, и последовательность команд
СМР ВХ, АХ
JG BXM
если они имеют знак.
В отличие от СМР команда сравнения строк CMPS вычитает операнд-приемник из операнда-источника. Это означает, что команды условной передачи управления, указываемые после команды CMPS, должны отличаться от тех, что в аналогичной ситуации следовали бы за командой СМР. А именно: слова "источник" и "приемник" в таблице должны поменяться местами.
