Уже говорилось, что программа, как правило, выполняется в естественной последовательности, т.е. в порядке написания ее команд сверху вниз. Фактически это происходит следующим образом: в регистр IP автоматически загружается смещение следующей команды и процессор выбирает для выполнения команду по адресу CS:IP.
Поэтому прервать эту естественную последовательность выполнения можно, загрузив в регистр IP (и, может быть, в CS) некоторые другие значения. Однако сделать это впрямую (например, командами mov или lea) невозможно. Для этого существуют специальные команды передачи управления (или перехода).
Следует различать переходы вперед и назад по программе. Переходы назад нельзя рекомендовать, поскольку они значительно ухудшают понимаемость программы и усложняют ее логику. Переходы вперед порождают проблемы при компиляции, поскольку в строке перехода метка перехода еще не определена (требуется задавать двухпроходный режим компилятора).
Переходы бывают:
· короткими (short) – в пределах ±128 байт от команды перехода
· ближними (near) – в пределах одного программного сегмента
· дальними (far) – в другой программный сегмент
· межпрограммными – в другую программу в защищенном режиме.
Мы будем рассматривать только короткие и ближние переходы.
Переходы бывают безусловными и условными, т.е. происходящими только при выполнении какого-либо условия (тех или иных значений флагов).
Переходы могут не сохранять никакой информации для возврата в точку перехода или сохранять такую информацию (в этом случае переход называется переходом с возвратом или вызовом подпрограммы).
Формат jmp Операнд
Операнд: метка, РОН, ПП
Процессор: 8086
В общем случае формируется машинная команда ближнего (near) перехода, по которой фактически к значению регистра IP прибавляется (или вычитается) двухбайтовое смещение относительно команды перехода.
Однако в перечисленных ниже случаях формируется машинная команда короткого (short) перехода, по которой фактически к значению регистра IP прибавляется (или вычитается) однобайтное смещение относительно команды перехода:
· Компилятор сам в состоянии выяснить, что переход происходит в пределах ±128 байт.
· В команде указан оператор short: jmp short Операнд
· В качестве операнда задан однобайтный РОН или байт памяти.
Команда короткого перехода выполняется быстрее и занимает меньше места в памяти, чем команда ближнего перехода.
Так же, как и адресация, переход может быть прямой и косвенный. Прямым переходом считается переход на метку.
Кроме обычных меток в Ассемблере предусмотрены специальные стандартные метки @@, которых в программе может быть любое число. По команде jmp @B происходит переход на ближайшую метку @@ вверх по программе, по команде jmp @F происходит переход на ближайшую метку @@ вниз по программе.
Косвенным переходом считается переход по адресу, который хранится в некоторой ячейке памяти или РОН. Косвенные переходы дают возможность осуществлять переходы динамически в разные места в зависимости от ситуации, складывающейся при выполнении программы.
Условные переходы имеют формат 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 с аналогичными постфиксами.
Команда LOOP имеет формат:
mov CX, Источник ;Загр. в CX числа повторений
Метка: ...
... ; Тело цикла
...
loop Метка
По команде LOOP происходит уменьшение значения CX на единицу и, если
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.