Меню сайта

Урок 76. Проверки кода условия

Первая группа команд условного переходапроверяет текущее состояние
— — — регистра флагов. — Затем в зависимости от кодов условия команда
— — — делает переход (или не делает). — Команды условного перехода не
— — — устанавливают флаги, а только проверяют ихтекущее состояние.
— — — Ранее рассмотренные арифметические илогические команды
— — — устанавливают флаги. — В последующих примерах предположим, что
— — — команда сравнения CMP уже установилафлаги.

— — — — — На Фиг.4.29 показаны команды условногоперехода и проверяемые
— — — ими флаги. В строках рисунка перечисленыкоманды условного
— — — перехода, а в пяти колонках показаносостояние флагов. Буква X в
— — — любой позиции означает, что команда непроверяет флаг. Цифра 0
— — — означает, что этот флаг должен бытьсброшен, чтобы условие было
— — — выполнено и переход произошел. Цифра 1означает, что флаг должен
— — — быть установлен, чтобы переход произошел.Некоторые элементы
— — — таблицы показывают выражение, котороедолжно быть истинно, чтобы
— — — переход произошел. Так сделано дляарифметических переходов, и мы
— — — обсудим их далее более подробно.

— — — — — На Фиг.4.29 условные переходы разделены натри группы:
— — — непосредственно проверяющие один изфлагов- делающие арифметическое
— — — сравнение без знака- делающиеарифметическое сравнение со знаком.

— — — — — На Фиг.4.29а показана проверка отдельныхфлагов. Условный
— — — переход может проверить каждый из этихпяти флагов непосредственно
— — — на 0 или 1. Проверка флага переносапоказана на рисунке в группе
— — — арифметики без знака, поскольку она имеетеще и арифметический
— — — смысл. Заметим, что многие командыусловного перехода имеют более
— — — одной мнемоники, если даже выполняетсяодна и та же проверка.
— — — Например, проверку флага нуля осуществляеткоманда JZ (переход,
— — — если результат операции равен нулю).Однако команда JE (переход,
— — — если равно) также порождает ту же команду.Следующая
— — — последовательность поясняет смысл этого:

— — — — — -CMP AX, BX
— — — — — -JELABEL

— — — — — Команда CMP вычитает содержимое регистраBX из содержимого
— — — регистра AX, устанавливая флаги в соответствиис результатом. Так
— — — как результат нулевой, если оба операндаравны, флаг нуля
— — — показывает равенство. Аналогично, командаJNZ (переход, если не
— — — нуль) идентичен команде JNE (переход, еслине равно). Команда JP
— — — (переход по четности) — то же самое, что икоманда JPE (переход при
— — — наличии четности)- команда JNP (переход понечетности) — то же
— — — самое, что команда JPO (переход приотсутствии четности).
— — — — Команды — — — — — — — — — — — — — — — — — — — — — — — Флаги
— — — — условного
— — — — перехода — — — — OF — — — CY — — — -Z — — — — — — P — — S — — Комментарий
— — ———————————————————————
— — — — JE/JZ — X — — — X — — — -1 — — — — — X — — — — — — X
— — — — JP/JPE X — — — X — — — -X — — — — — 1 — — — — — — X
— — — — JO — — — -1 — — — X — — — — X — — — — -X — — — — — — X
— — — — JS — — — -X — — — X — — — — X — — — — -X — — — — — — 1
— — — — JNE/JNZ — — — — — X — — — X — — — -0 — — — — — X — — — — — — X
— — — — JNP/JPO — — — — — X — — — X — — — -X — — — — — 0 — — — — — — X
— — — — JNO — — — 0 — — — X — — — -X — — — — — X — — — — — — X
— — — — JNS — — — X — — — X — — — -X — — — — — X — — — — — — 0
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — (a)

— — — — JL/JNGE — — — — — a — — — X — — — — — X — — — — X — — — — — — b — a NEQb
— — — — JLE/JNG — — — — — a — — — X — — — — -1 — — — — X — — — — — — b — Z OR (A NEQ B)
— — — — JNL/JGE — — — — — a — — — X — — — — — X — — — — X — — — — — — b — a = b
— — — — JNLE/JG — — — — — a — — — X — — — — — 0 — — — — X — — — — — — b — (NOTZ) AND (a=b)
— — — — — — — —
— — — — — — — — — — — — — — — — — — — — — (b)

— — — — JB/JNAE/JC — X — — — — — 1 — — — — — X — — — -X — — — — — — X
— — — — JBE/JNA — — — — — X — — — 1 — — — — — 1 — — — — X — — — — — — X — CY ORZ
— — — — JNB/JAE/JN — X — — — — — 0 — — — — — X — — — -X — — — — — — X
— — — — JNBE/JA — — — — — X — — — 0 — — — — — 0 — — — — X — — — — — — X — (NOTCY) AND (NOT Z)
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — (c)
— — ——————————————————————-

— — — — — — Фиг. 4.29 Проверка флагов перехода поусловию. (a) Проверка флага
— — — — — — (b) Арифметика со знаком- (c)беззнаковая арифметика.

— — — — — Следующую группу команд условного переходана Фиг.4.29б
— — — составляют арифметические сравнения сознаком. Существуют четыре
— — — условия, которые могут быть проверены:меньше (JL), меньше или
— — — равно (JLE), больше (JG), больше или равно(JGE). Другие четыре
— — — мнемоники — отрицания этих четырех. Вслучае арифметики со знаком
— — — ассемблер использует мнемонику в названиикоманд «меньше» (less) и
— — — «больше» (greater). Далее мыувидим, что для арифметики без знака
— — — ассемблер использует мнемонику»выше» (above) и «ниже» (below).

— — — — — Арифметические выражения можно понять,используя их вместе с
— — — командой CMP. Например,

— — — — — CMP — -AX,BX
— — — — — JL — — -LABEL

— — — — — Преход произойдет, если содержимоерегистра AX меньше
— — — содержимого регистра BX. Вы можете читатькомбинацию команд
— — — сравнения и условного перехода вместе, какодин оператор: операнд
— — — результата встречается первым, затем идетусловный оператор, а за
— — — ним следует исходный операнд. Другойпример:

— — — — — CMP — — -CX,WORD_IN_MEMORY
— — — — — JNLE — -LABEL
— — — — — — можно прочитать так: «переход, еслисодержимое регистра CX не
— — — меньше, чем, или равен содержимому ячейкипамяти WORD_IN_MEMORY.
— — — Этот прием можно использовать дляопределения значения любой команды
— — — арифметического перехода, учитывающей знакили не учитывающей.

— — — — — Как показано на Фиг.4.29б арифметическиесравнения со знаком
— — — проверяют одновременно несколько флагов.Фактически каждая из этих
— — — команд проверяет некоторую комбинациюфлагов переполнения, знака,
— — — и, возможно, флага нуля. Например, вкоманде JL требуется, чтобы
— — — флаги переполнения и знака имели разныезначения. Если они имеют
— — — одинаковое значение, первый операнд не былменьше второго.
— — — Рассмотрим эту операцию несколькоподробнее, чтобы понять работу
— — — арифметических сравнений.

— — — — — Когда сравниваются два числа со знаком,возможны четыре
— — — комбинации флагов знака и переполнения.Рассмотрим каждую из
— — — четырех комбинаций, чтобы определить какоесостояние операндов
— — — привело к данному результату. Предположим,что в каждом случае
— — — флаги установила команда CMP, вычитавшаядва операнда.

— — — — — Знак S = 0, переполнение O = 0.

— — — — — Условие S=0 означает, что результатвычитания положителен.
— — — Условие O=0 означает, что переполнения небыло, т.е. результат,
— — — представленный в дополнительном коде,правильный. Вычитание двух
— — — чисел, дающее положительный результат,показывает, что первое число
— — — больше второго, и поэтому имеет местосоотношение «больше». Однако
— — — вычитание двух равных чисел также даетположительный результат, так
— — — что условие S=0, O=0 означает «большеили равно».

— — — — — S=1, O=0

— — — — — В этом случае O=0 означает, что результатверен, а S=1 говорит
— — — о том, что он отрицателен. Чтобы получитьотрицательный результат,
— — — большее число должно вычитаться изменьшего, и соотношение означает
— — — «меньше».

— — — — — S = 0, O = 1

— — — — — Здесь O=1 показывает, что результатневерен, т.е. вышел за
— — — пределы возможностей разрядной сетки. Этозначит, что сложение двух
— — — положительных чисел дало отрицательныйрезультат или наоборот. В
— — — данном случае это сравнение показывает,что знак результата
— -&nb
sp- неверен- поэтому результат этого сравненияидентичен случаю, когда
— — — S=1, O=0, что означает «меньше».

— — — — — S = 1, O = 1

— — — — — Снова O=1 говорит о том, что знакрезультата неверен. Поэтому
— — — вычитание должно было привести к оченьбольшому положительному
— — — числу, и соотношение будет «большеили равно».

— — — — — В некоторых случаях также учитывается флагнуля. Например,
— — — команда JLE выполняется, если условие есть»меньше» (знак и
— — — переполнение разные) или «равно»(флаг нуля равен 1). Эти три флага
— — — позволяют микропроцессору 8088 проверитьвсе возможные комбинации
— — — чисел со знаком.

— — — — — Последняя часть таблицы (Фиг.4.29в)показывает условия,
— — — проверяемые для арифметики без знака. Каки в случае арифметики со
— — — знаком, существуют четыре возможныесоотношения между операндами,
— — — которые может проверить микропроцессор.Для того чтобы отличить
— — — команды условного перехода ориентированныена беззнаковую
— — — арифметику от знаковой арифметики,используются слова «выше» и
— — — «ниже» в названии команд.Вероятно, этим выражается точка зрения
— — — создателей набора команд, заключающаяся втом, что арифметика без
— — — знака будет использоваться в программахдля вычисления адресов, а
— — — отрицательных адресов не бывает. «Выше»и «ниже» показывают
— — — расположение значения адресов внутриадресного пространства, в то
— — — время как «больше» и»меньше» говорит о соотношении чисел со
— — — знаком. Здесь важно, что выполняетсяименно та команда, которая
— — — указана в программе на языке ассемблера,независимо от типов
— — — сравниваемых операндов. Например,программа сравнивает два числа со
— — — знаком, а использует команду JA (переход,если выше).
— — — Микропроцессор выполняет условный переходв зависимости от
— — — соотношения двух чисел, считая их числамибез знака, т.е. именно
— — — программист обязан выбрать правильнуюкоманду условного перехода.

— — — — — Микропроцессор 8088 при сравнении двухчисел без знака
— — — учитывает только два флага. Флаг переносапоказывает, какое из
— — — чисел больше. Сравнение устанавливает флагпереноса, если первый
— — — операнд ниже второго или сбрасывает флагпереноса, если первый
— — — операнд либо выше, либо равен второмуоперанду, и флаг нуля
— — — определяет, что в данном случае верно.

— — — — — Сравнения без знака можно читать так же,как и сравнения со
— — — знаком. Например,

— — — — — CMP — — AX,BX
— — — — — JA — — — LABEL

— — — — — — переход на метку LABEL происходит, еслирегистр AX выше
— — — регистра BX. Условный переход выполняетсявсегда, если объявленное
— — — соотношение существует между первым ивторым операндами
— — — предшествовавшей команды сравнения.

Категория: Программирование на Ассемблере | Дата: 02.02.13

Меню раздела
Блок