Команды передачи управления. Циклы. Команды ввода и вывода IN и OUT

Страницы работы

Фрагмент текста работы

Глава 8. Команды передачи управления. Циклы

Команды передачи управления

Уже говорилось, что программа, как правило, выполняется в естественной последовательности, т.е. в порядке написания ее команд сверху вниз. Фактически это происходит следующим образом: в регистр IP автоматически загружается смещение следующей команды и процессор выбирает для выполнения команду по адресу CS:IP.

Поэтому прервать эту естественную последовательность выполнения можно, загрузив в регистр IP (и, может быть, в CS) некоторые другие значения. Однако сделать это впрямую (например, командами mov или lea) невозможно. Для этого существуют специальные команды передачи управления (или перехода).

Следует различать переходы вперед и назад по программе. Переходы назад нельзя рекомендовать, поскольку они значительно ухудшают понимаемость программы и усложняют ее логику.  Переходы вперед порождают проблемы при компиляции, поскольку в строке перехода метка перехода еще не определена (требуется задавать двухпроходный режим компилятора).

Переходы бывают:

·  короткими (short) – в пределах ±128 байт от команды перехода

·  ближними (near)  – в пределах одного программного сегмента

·  дальними (far) – в другой программный сегмент

·  межпрограммными – в другую программу в защищенном режиме.

Мы будем рассматривать только короткие и ближние переходы.

Переходы бывают безусловными и условными, т.е. происходящими только при выполнении какого-либо условия (тех или иных значений флагов).

Переходы могут не сохранять никакой информации для возврата в точку перехода или сохранять такую информацию (в этом случае переход называется переходом с возвратом или вызовом подпрограммы).

8.1.   Безусловный переход JMP

Формат      jmp   Операнд

Операнд:   метка, РОН, ПП

Процессор: 8086

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

Однако в перечисленных ниже случаях формируется машинная команда короткого (short) перехода, по которой фактически к значению регистра IP прибавляется (или вычитается) однобайтное смещение относительно команды перехода:

·  Компилятор сам в состоянии выяснить, что переход происходит в пределах ±128 байт.

·  В команде указан оператор short:  jmp short  Операнд

·  В качестве операнда задан однобайтный РОН или байт памяти.

Команда короткого перехода выполняется быстрее и занимает меньше места в памяти, чем команда ближнего перехода.

Так же, как и адресация, переход может быть прямой и косвенный. Прямым переходом считается переход на метку.

Кроме обычных меток в Ассемблере предусмотрены специальные стандартные метки @@, которых в программе может быть любое число. По команде jmp @B происходит переход на ближайшую метку @@ вверх по программе, по команде jmp @F происходит переход на ближайшую метку @@ вниз по программе.

Косвенным переходом считается переход по адресу, который хранится в некоторой ячейке памяти или РОН. Косвенные переходы дают возможность осуществлять переходы динамически в разные места в зависимости от ситуации, складывающейся при выполнении программы.

8.2. Условные переходы Jxxx

Условные переходы имеют формат          jxxx  Метка

Все они осуществляют короткий переход при некотором условии, определяемом постфиксом мнемокода xxx. Все эти условия определяются состояниями флагов (за исключением команды JCXZ, условие перехода которой определяется состоянием регистра CX).

Если необходимо осуществить условный близкий переход, приходится комбинировать условный и безусловный переходы.

Вообще говоря, условие перехода определяется только состояниями флагов, однако чтобы не заниматься анализом значений флагов их можно выставить при помощи примененной непосредственно перед условным переходом команды

cmp  Операнд1, Операнд2

Тогда комбинации флагов приобретают определенный математический смысл, указанный в следующей таблице:

Постфикс

English

Переход после

cmp x,y  ,  если:

Условия на флаги

Любые числа

E

Equal

x=y

ZF=1

NE

Not Equal

x¹y

ZF=0

Числа со знаком

L / NGE

Less / Not Greater Equal

x<y

SF¹OF

LE / NG

Less Equal / Not Greater

x£y

SF¹OF или ZF=1

G / NLE

Greater / Not Less Equal

x>y

SF=OF и ZF=0

GE / NL

Greater Equal / Not Less

x³y

SF=OF

Числа без знака

B / NAE

Below / Not Above Equal

x<y

CF=1

BE / NA

Below Equal / Not Above

x£y

CF=1 или ZF=1

A / NBE

Above / Not Below Equal

x>y

CF=0 и  ZF=0

AE / NB

Above Equal / Not Below

x³y

CF=0

После других команд

Z / NZ

Zero / Not Zero(флаг нуля)

ZF= 1 / 0

S / NS

Sign / Not Sign (флаг знака)

SF= 1 / 0

C / NC

Carry / Not Carry (флаг заема)

CF= 1 / 0

O / NO

Overflow / Not Overflow (флаг переполнения)

OF= 1 / 0

P / NP

Parity / Not Parity (флаг четности)

PF= 1 / 0

Переход по нулю СХ

CXZ

CX equal to Zero

CX=0

Перечисленные в таблице условия действуют и для команд CMOVxxx с аналогичными постфиксами.

8.3.   Команды циклов LOOP, LOOPZ, LOOPNZ

Команда LOOP имеет формат:

mov  CX, Источник       ;Загр. в CX числа повторений

Метка:      ...

         ...                                   ; Тело цикла

         ...

         loop Метка

По команде LOOP происходит уменьшение значения CX на единицу и, если

Похожие материалы

Информация о работе