Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Булатов В.Н. Архитектура микропроцессороной системы, состав машинных команд и основы программирования микропроцессорной .pdf
Скачиваний:
97
Добавлен:
02.05.2014
Размер:
7.1 Mб
Скачать

6.8 Команда сравнения — компарации

Здесь трудно что-либо добавить к тем комментариям, которые есть в таблице 5. Сравнение производится на основе операции вычитания, но разность нигде не фиксируется, потому что нужна не она, а ее признаки: был ли заем? нулевой ли результат? и тому подобное — которые заносятся во флажковые биты.

Ассемблер команды (пример):

CMP AX,[1CFO].

И в заключение главы — команда инверсии:

а) Ассемблер: NOT dst. Комментарий: dst:=-<dst>. б) Машинный код операции:

Необходимо отметить, что эта команда флажки «не трогает». Так реализовано преднамеренно, так как часто бывает необходимо проинвертировать что-то, при этом состояние флажков — сохранить. Естественно, что бывает и наоборот, когда нужно проинвертировать и одновременно в соответствии с проинвертированным результатом взвести флажки. Для этих целей используют команду XOR dst, FF, если нужно инвертировать байт, или XOR dst, FFFF, если — слово. Суть действия этой команды изложена в примерах в п. 7 для команды XOR.

7 Команды ветвления и переходов

7.1 Команды ветвления

Это важнейшая группа команд, позволяющая принимать решение. Все команды, которые до сих пор рассматривались, выполняли действие. А вот возможностью принять решение по результатам каких-либо действий обладают только команды ветвлений. Ветвление —это переход (скачок) на указанное в команде перехода место, если выполнилось указанное в команде условие.

К примеру, команда «jump no Z 5CЗF» в переводе на русский язык означает: прыгнуть по адресу 5CЗF, если нет Z (ассемблер: JNZ 5СЗF). Она осуществляет прыжок на адрес 5СЗF, то есть следующая команда будет выбираться по адресу 5СЗF, если флаг Z = 0. В противном случае

45

происходит выборка следующей команды (JNZ —пустая команда, если Z = 1).

Таких команд МП 8086 реализует в количестве 16 шт. Но все эти команды имеют единый формат КОПа и команды в целом.

Формат КОПа:

Из формата команды следует, что типов команд —23= 8. Каждая команда имеет свой антипод. То есть, если есть команда JNZ Addr (перейти, если Z= 0), то и есть ее антипод JZ Addr (перейти, если Z= 1).

Команда условного перехода в ассемблере всегда начинается с

буквы J (jump — скачок). Поэтому

в приведенной

ниже таблице

7 указываются недостающие буквы, следующие за J для различных

типов команд, и соответствующие им условия переходов.

 

 

 

В скобках указаны

допустимые

 

альтернативные

обозначения.

То есть можно записать JB, а можно и JNAE.

 

 

 

Таблица 7 — Синтез команд ветвлений по условиям ветвлений

 

Тип команды

Признак D0 = 0

 

Признак D0 =0

 

 

 

Ассемблер(доп.

Условие перехода

Ассемблер (доп. к

 

Условие

 

 

 

J)

 

 

J)

 

перехода

 

 

000

O

OF = 1

 

NO

 

OF = 0

 

 

001

B (C,NAE)

CF = 1

 

NB(NC,AE)

 

CF = 0

 

 

010

E(Z)

ZF = 1

 

NE(NZ)

 

ZF = 0

 

 

011

BE(NA)

CF V ZF = 1

 

NBE (A)

 

CF V ZF=0

 

 

100

S

SF = 1

 

NS

 

SF = 0

 

 

101

P (PE)

PF = 1

 

NP (P0)

 

PF = 0

 

 

110

L (NGE)

SF OF = 1

 

NL (GE)

 

SF OF = 0

 

 

111

LE (NG)

(SF OF) V

 

NLE (G)

 

(SF OF) V

 

 

 

 

ZF=1

 

 

 

ZF=0

 

Для системных специалистов определяющим является не обозначение команды в ассемблере, а условие перехода, которое определяется состоянием или состояниями тех или иных флажков. То есть, по какому событию происходит переход. Если нужно перейти по условию OF = 1, то пишем JO; если переход осуществляется по условию CF =1, то пишем JC, хотя C (вторая строчка в таблице 7) — альтернативное обозначение, о котором программисты часто не знают. Дело в том, что для программистов первоначальным является само условие перехода: «больше», «меньше» и тому подобное.

Из таблицы 7 следует, что условия переходов диктуют 5 флагов (смотрите главу 2):

46

OF — арифметическое переполнение. Флаг OF=1, если относительно знакового бита в результате выполнения, например, арифметических команд произошла следующая метаморфоза:

(+)+(+)=(-);

(+)-(-)=(-);

(-)+(-)=(+);

(-)-(+)=(+);

(здесь в скобках указаны знаки).

CF —переполнение (байта, слова) или заем, если было вычитание. ZF —признак нулевого результата. ZF = 1 — значит получили в

результате команды АЛУ, INC, или DEC — результат, равный нулю.

SF —знак. Здесь все просто: если команда воздействует на флаги, то флаг SF запоминает содержимое старшего бита данных:

а) SF:= <D7>, если операнд — 1 байт;

б) SF:= <D15>, если операнд — 1 слово.

PF — событие (признак) наличия в результате четного (PF = 1) числа единиц; касается только байта (если слово, то —младшего байта).

Приведем пример. Пусть в AX хранится: 1DCO. Выполним команду:

AND AX,1245

Н-код

0001

Двоичный код

(АХ)

1DCO

1101

1100

0000

И

0001

И

0100

0101

data

1245

0010

Результат=1040 0001 0000 0100 0000 (АХ)

(D15)

Каково же будет состояние флагов?

OF = 0; арифметического переполнения не было (хотя для этой команды это событие бессмысленно, но ЦА выполняет свой алгоритм);

CF = 0; логическая операция —поразрядная операция, и у нее не может быть переноса (заема);

ZF = 0; результат отличен от нуля: 1040 ≠ 0;

SF = 0; знаковый флажок запоминает: SF= < D15> = 0; хотя это для данной команды то же не имеет смысла, но ЦА выполняет свой алгоритм;

PF = 0 – в младшем байте одна единица, то есть нет четного числа единиц (кстати, 0 —это четное число единиц).

Знание правил установки флагов и позволяет эффективно использовать команды условного перехода.

В таблице 7 указаны и комбинированные условия переходов. В этом случае лучше использовать для обозначения команды в ассемблере буквы, не входящие в скобки. Разберем эти условия подробнее.

1) CF V ZF. Допустим, из числа А вычитается число В, или сравнивается число А с числом В (наиболее часто используемый прием применения этого условия). Каковы варианты состояний флагов, соответствующие этой функции? Для ответа на этот вопрос составим

47

таблицу истинности функции CF V ZF (таблица 8), исходя из смысла указанных операций. Исходя из таблицы 8, можно сделать следующие заключения:

Таблица 8

CF ZF

CFVZF

Событие

0

0

0

A > B

0

1

1

A = B

1

0

1

A < B

1

1

Не может быть

а) если CFvZF=1, то операнды или равны при ZF =1 (Е — eguivalent — равно), или при CF =1 (заем) операнд А меньше операнда В ( В — below —меньше, ниже). Следовательно, команда перехода означает: JBE — перейти, если меньше или равно (то есть, не больше);

б) если CFvZF= 0, то все наоборот, и команда перехода: JNBE — перейти, если больше (то есть нет событий В и Е: NO B&E).

2) SF OF. Это условие рассчитано на результат операций со знаковыми числами. Не вдаваясь в подробности анализа, можно отметить, что если после вычитания SF OF = 1, то вычитаемое со знаком меньше уменьшаемого со знаком (L — less — меньше). Соответственно команды переходов:

а) JL — перейти, если меньше (для результата со знаком); б) JNL – перейти, если не меньше (для результата со

знаком). 3) (SF OF)vZF. Это условие рассчитано также при операциях над

числами со знаком. Например, если после вычитания: (SF OF)vZF= 1, то полученный результат со знаком меньше или равен нулю, то есть не больше (LE —меньше или равно). Соответственно и команда перехода по этому условию: JLE.

Команда перехода по обратному условию (SF+OF)vZF=0: JNLE. Из всех команд ветвлений наиболее «заезженные» команды: JZ,

JNZ, JC, JNC, JBE, JNBE.

После того, как мы рассмотрели условия переходов и ассемблер команд условных переходов, можно перейти к методике формирования адреса перехода.

1) Адрес перехода — короткий. Его максимальная величина: ±12710 адресов. Такой размер продиктован практической целесообразностью. Действительно, при составлении программ условные переходы используются, как правило, в пределах «видимости», то есть в очень маленьких пределах по сравнению с общим размером программ.

48

2) Поскольку переход бывает необходимым как вперед, так и назад, то он, как и смещение disp (смотрите главу 3), задается в машинном коде команды – в дополнительном коде со знаком как смещение относительно текущего адреса, находящегося в IР.

3) Для удобства написания программы в ассемблере (для чего собственно и придуман ассемблер) в адресной части команды условного перехода ставится не смещение, а непосредственный адрес перехода в текущем сегменте программы, а смещение вычисляется транслятором. Теперь все это проследим на отдельных примерах синтеза команд в ассемблере и машинных кодах.

Пример 1 — По адресу 0100 расположить команду условного перехода с условием: если результат 0 (Z = 1), то перейти на 010F.

Ответ:

а) в ассемблере (все просто):

JZ 010F

б) в машинном коде: сначала составляем КОП :

1)тип команды JZ = 010 (третья строчка таблицы 7);

2)признак = 0 (таблица 7).

Теперь составляем второй байт команды — смещение (disp). Учитывая, что размер формата команды JZ Addr — 2 байта, текущее значение адреса команды будет следующим: IP = 0100 + 2 = 0102. Вычитаем из конечного текущий адрес:

disp = 010F — 0102 = 000D = 1310 < 12710.

Окончательно:

Address

Command

Assembler

0100

74

JZ 010F

0101

OD

 

Пример 2 —По адресу 0100 расположить команду условного перехода с условием: если больше (без знака), то перейти на адрес 0092:

Ответ:

а) в ассемблере:

JNBE 0092

б) в машинном коде: 1) КОП:

49