
- •Введение
- •1.1. Основные направления эволюции микрокомпьютеров
- •1.2. Основные сведения о компьютерах
- •1.3. Представление чисел
- •Заключение
- •Лекция 2 машинная организация процессора 80286
- •2.1. Введение
- •2.2. Структура памяти
- •2.3. Сегментация памяти
- •2.4. Структура ввода-вывода
- •2.5. Регистры
- •2.6. Операнды и режимы адресации операндов
- •2.7. Замечания о режимах адресации
- •Глава 3 базовая система команд процессора 80286
- •3.1. Нотация языка ассемблера
- •3.2. Команды передач данных
- •3.3. Арифметические команды
- •Лекция 6. Цепочечные команды
- •Лекция 7. Команды безусловной передачи управления
- •Лекция 8. Команды условной передачи управления
- •Лекция 9. Прерывания
- •Int n
- •Лекция 10. Флажковые команды
- •3.10. Команды синхронизации
- •3.11. Поддержка языков высокого уровня
- •3.12. Замечания о префиксах
- •3.13. Воздействие на флажки
- •Заключение
Лекция 8. Команды условной передачи управления
В процессоре 80286 имеются команды условных переходов, которые совместно с командами сравнения СМР находят отношение между двумя числами. Определение отношения осуществляется в два этапа. Сначала процессор выполняет команду сравнения, которая производит вычитание двух чисел, устанавливает по результату флажки и уничтожает разность. Затем он выполняет команду условного перехода, которая проверяет флажки и производит переход, если флажки показывают, что числа удовлетворяют заданному отношению. Предположим, например, что необходимо выполнить конкретные команды, если число в регистре ВН равно числу в регистре BL:
1. Сравнить содержимое регистров ВН с BL (устанавливаются флажки).
2. Перейти к шагу 5, если ZF = 0.
3. Специальные команды ...
4. ... выполняемые, если содержимое регистра ВН равно содержимому регистра BL.
5. ...
В этом примере по команде сравнения производится вычитание значения содержимого регистра BL из значения в регистре ВН и по результату устанавливаются флажки. Если ВН = BL, то результат равен нулю и флажок ZF устанавливается в 1. Следовательно, проверка на равенство заключается в проверке состояния флажка ZF и именно это делает команда условного перехода на шаге 2: если ВН BL, ZF = 0 и шаги 3 - 4 пропускаются.
Каждая из команд условного перехода состоит из 8-битного кода операции и 8 бит, определяющих назначение перехода. Оно равно разности между смещением назначения и смещением команды условного перехода. Как мы уже говорили, это ведет к позиционно-незавиеимому коду (переходы относительны) и к компактному коду (назначение определяется всего 8 битами). Но при этом назначение перехода будет в сравнительно небольшом диапазоне (примерно 127 байт) от команды условного перехода. Для двух форм команд условных переходов ("близкая" и "далекая") потребовалось бы слишком много кодов операций. Случай "близкого" перехода встречается гораздо чаще, поэтому было решено выбрать этот вариант ("далекий" условный переход всегда можно осуществить двумя командами, в которых "близкий" условный переход обходит "далекий" безусловный переход).
Кроме проверки на равенство часто нужно знать, какое число больше, и при этом возникает интересный вопрос: является ли число 1111 1111 больше числа 0000 0000? Ответ может быть и положительным и отрицательным. Если числа считать беззнаковыми, то первое число равно 255 и оно, конечно, больше 0. Но если числа считать знаковыми, то первое число равно -1, т.е. меньше 0. Следовательно, отношение "больше" и "меньше" зависит от того, считаются числа беззнаковыми или знаковыми, и целесообразно ввести новые термины, позволяющие различать эти два случая. При сравнении чисел как знаковых мы пользуемся терминами меньше и больше, а при сравнении беззнаковых чисел - терминами ниже и выше. Поэтому число 1111 1111 выше числа 0000 0000 и одновременно меньше его. А число 0000 0000 ниже и меньше числа 0000 0001.
Следовательно, между двумя числами существуют отношения равны, выше, ниже, меньше и больше. Каждое из этих условий можно определить по
состояниям флажков после команды сравнения (см. табл. 3.9). В процессоре 80286 имеются команды условных переходов, которые проверяют по состояниям флажков, удовлетворяется конкретное отношение или нет. Имеются следующие условные переходы:
-
Название
Смысл
JE
Перейти, если равны
JNE
Перейти, если не равны
JL
Перейти, если меньше
JNL
Перейти, если не меньше
JG
Перейти, если больше
JNG
Перейти, если не больше
JB
Перейти, если ниже
JNB
Перейти, если не ниже
JA
Перейти, если выше
JNA
Перейти, если не выше
Можно придумать и другие отношения, например "меньше или равны", но это то же самое, что и "не больше". Вот список альтернативных названий приведенных выше команд:
Название |
Альтернативное название |
Смысл альтернативного названия |
JE |
JZ |
Перейти, если нуль |
JNE |
JNZ |
Перейти, если не нуль |
JL |
JNGE |
Перейти, если не больше или равны |
JNL |
JGE |
Перейти, если больше или равны |
JG |
JNLE |
Перейти, если не меньше или равны |
JNG |
JLE |
Перейти, если меньше или равны |
JB |
JNAE |
Перейти, если не выше или равны |
JNB |
JAE |
Перейти, если выше или равны |
JA |
JNBE |
Перейти, если не ниже или равны |
JNA |
JBE |
Перейти, если ниже или равны |
Приведем также фактические состояния флажков для различных команд условных переходов.
-
Название команды
Состояние флажков
JE/JZ
ZF = 1
JNE/JNZ
ZF = 0
JL/JNGE
(SF OF) = 1
JNL/JGE
(SF OF) = 0
JG/JNLE
(SF OF) ZF = 0
JNG/JLE
(SF OF) ZF = 1
JB/JNAE
CF = 1
JNB/JAE
CF = 0
JA/JNBE
CF ZF = 0
JNA/JBE
CF ZF = 1
Имеются команды условных переходов, которые связаны не с отношениями между числами, а с состоянием конкретного флажка. Команды JZ и JNZ, приведенные выше, фактически проверяют состояние флажка нуля, а команды JB и JNB - флажка переноса. Приведем и другие команды условных переходов, которые проверяют состояние конкретного флажка:
-
Название
Смысл
Состояние флажка
JS
Перейти, если знак
SF = 1
JNS
Перейти, если не знак
SF = 0
JO
Перейти, если переполнение
OF = 1
JNO
Перейти, если не переполнение
OF = 0
JP
Перейти, если паритет
PF = 1
JNP
Перейти, если не паритет
PF = 0
Для последних двух команд имеются альтернативные названия:
Название |
Альтернативное название |
Смысл альтернативного название |
JP |
JPE |
Перейти, если паритет чётный |
JNP |
JPO |
Перейти, если паритет нечётный |