- •Введение
- •1 Основы микропроцессорной техники
- •1.1 Классификация команд и архитектура ЭВМ
- •1.2 Секционный микропроцессор.
- •1.3 Однокристальный микропроцессор.
- •1.4 Микропроцессорный модуль.
- •3.1 Тип кода операции с dst и rsc
- •3.2 Тип кода операции с dst. Группа коман MOV
- •4 Организация стековой памяти
- •5 Команды сдвигов и приращений.
- •5.1 Команды приращений
- •5.2 Команды сдвига
- •6 Арифметико-логические команды
- •6.1 Команды сложения
- •6.2 Команда сложения с учетом переноса
- •6.3 Операция вычитания
- •6.4 Команда вычитания с учетом заема
- •6.5 Команда логической функции ИЛИ
- •6.6 Команда логической функции И
- •6.7 Команда «Исключающая ИЛИ»
- •Внутриразрядная сумма = 0
- •6.8 Команда сравнения — компарации
- •7 Команды ветвления и переходов
- •7.1 Команды ветвления
- •7.2 Команды перехода
- •8.1 Внутрисегментные переходы
- •8.2 Межсегментные переходы
- •10 Цепочные команды
- •11 Другие одиночные команды
- •13.1 Процедура прерываний и команды прерываний
- •Адрес
- •13.2 Режимы работы ПКП
- •13.3 Программирование ПКП
- •14 Параллельный интерфейс
- •15 Последовательный интерфейс
- •15.1 Антология последовательного интерфейса
- •15.3 Описание регистров 8250 и программирование
- •Регистр управления линией
- •Регистр управления модемом
- •15.4 Порядок инициализации 8250
- •16 Программируемый таймер
- •16.7 Временные диаграммы таймера
- •16.8 Программирование таймера
- •Чтение счетчика канала 2
- •16.9 Чтение содержимого счетчиков
- •16.10 Таймер на системной плате IBM PC
- •17 Клавиатурный интерфейс
- •18. Заключение
- •Приложение А
- •Действие
- •Сегментный регистр
- •Действие команды
- •Действие команды
- •Действие команды
- •SAHF — сохранение <AH> в F
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Команда – действие команды
- •Команда – действие команды
- •Команда – действие команды
- •Команда – действие команды
- •Команда – действие команды
- •Команда – действие команды
- •Команда – действие команды
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