Команды безусловной передачи управления - CALL, INT,RET, JMP

Команда вызова процедуры − CALL

Команда вызова процедуры − CALL(call a procedure - вызвать процедуру) при исполнении выполняет две функции:

· сохраняет в стеке по адресу SS:SP содержимое указателя команд IP (адрес возврата), при коротком вызове и содержимое CS, IP (по адресам SS:SP, SS:SP-2) при длинном (межсегментном) вызове;

· загружает в IP новый адрес команды, соответствующий вызываемой ближней процедуре, или загружает в CS, IP новый адрес команды, соответствующий вызываемой дальней процедуре (находящейся в другом сегменте). Команда CALL имеет следующий формат:

CALL имя,

где «имя» – имя вызываемой процедуры.

При трансляции ассемблер присваивает метке имя16- разрядный адрес, а команда CALL записывает этот адрес в указатель команд – IP.

Команда программного прерывания – INT

Команда INT инициирует в процессоре процедуру прерывания, в результате которой управление передается программе обработки прерывания с номером n. Этот номер указан в качестве операнда команды INT. В зависимости от источника, прерывания разделяются на аппаратные и программные, но процедуры обработки прерываний выполняются по одному алгоритму. Микропроцессор 8086 обрабатывает три различные команды прерывания - две команды вызова и одну команду возврата. Команда INT (interrupt - прерывать) имеет следующий формат:

INT тип_прерывания,

где тип_ прерывания– номер, идентифицирующий один из 256 различных векто­ров, находящихся в памяти (вектор - это четырехбайтная область памяти). Следовательно, каждому из 256 прерываний соответствует один вектор, где хранятся IP и CS программы обработки прерывания. При исполнении команды INT микропроцессор производит следующие действия:

1. Помещает в стек содержимое регистра флагов.

2. Помещает в стек значение регистра CS.

3. Помещает в стек значение регистра IP.

4. Обнуляет флаг трассировки TF и флаг разрешения прерываний IF для исключения пошагового режима исполнения команд и блокировки других маскируемых прерываний.

5. Вычисляет адрес вектора прерывания, для чего умножает тип_ прерыванияна 4.

6. Обращается в память по вычисленному адресу и загружает в регистр CS второе слово вектора прерывания.

7. Увеличивает адрес на 2 и загружает из памяти в регистр IP первое слово вектора прерывания.

8. Устанавливает флаги IF и TF.

Итак, после исполнения команды INT в стеке окажутся значения регистра флагов и регистров CS и IP, флаги TF и IF будут равны 0, а пара регистров CS:IP будет указывать на начальный адрес программы обработки прерывания.

Все 256 векторов прерывания размещаются в области памяти с младшими адресами. Так как каждый из них имеет длину 4 байта, то они занимают первые 1К байтов, т.е. область памяти с абсолютными адресами от 0до 3FFH.

Например, командаINT 21Нзаставит микропроцессор 8086 вычислить адрес вектора 54Н (4×21Н). Процессор обращается по этим адресам в память и читает из ячеек 54Н и 56Н, соответственно, в IP и CS, адреса программы обработки этого прерывания. Из 256 типов прерываний фирма Intel зарезервировала первые 5 (от 0 до 4) для внутренних прерываний. Вызванная программа анализирует содержимое регистров Al, AH, DX, определяет вид вызываемой функции и осуществляет передачу управления этой функции. В IBM PC многие другие типы прерываний зарезерви­рованы для нужд основной системы ввода-вывода (BIOS), а также для операцион­ной системы DOS.

Команда RET

Команда RET (return from procedure - возвратиться из процедуры) заставляет микропроцессор возвратиться из процедуры в программу, вызвавшую эту процедуру, делая это "откатом" всего, что сделала команда CALL.

Формат команды: RET

Команда RET обязательно должна быть последней командой процедуры, исполняемой микропроцессором. (Это не значит, что команда RET должна стоять в конце процедуры, она исполняется последней).

Команда RET извлекает из стека адрес возврата. Если процедура имеет атрибут NEAR (т.е. находится в том же сегменте команд, что и команда CALL), то команда RET извлекает из стека одно слово и загружает его в указатель команд IP. Если процедура имеет атрибут FAR (т.е. находится в другом сегменте команд), то команда RETизвлекает из стека два слова: сначала смещение адреса для загрузки в указатель команд IP, а затем адрес сегмента для загрузки в регистр CS.

Рассмотрим пример.

Для вызова процедуры MY_PROC с атрибутом NEAR из некоторого места программы необходимо выполнить следующую последовательность команд (в левом столбце указаны виртуальные смещения адресов команд):

04F0 CALL MY PROC; Вызвать процедуру.

04F3 М2: Mov AX,BX; Вернуться сюда из процедуры.

04F5 . . . ; Здесь могут быть записаны

. . . ; команды основной

. . . ; программы.

proc MY PROC; Начало процедуры.

0602 Mov CL,6; Команды

. . . ; процедуры

. . .

0622 Ret ; Вернуться в основную программу (в адрес 04F5h).
0624 My proc Endp; Конец процедуры.

При исполнении команды CALL микропроцессор помещает в стек смеще­ние адреса метки М2 (04F3H), затем загружает смещение адреса процедуры MY_PROC (0500H) в указатель команд IP. Так как в псевдооператоре PROC атрибут дистанции не указан, то процедура MY_PROC по умолчанию имеет атрибут NEAR. Содержимое регистра IP изменилось, следовательно, микропроцессор продол­жит исполнение с той команды, которая имеет это новое смещение адреса. В нашем приме­ре такой командой будет MOV CL,6.

Когда микропроцессор обнаруживает команду RET, то он извлекает адрес возврата из стека и помещает его в указатель команд IP. Это заставляет его возобновить исполнение программы с команды, имеющей метку М2.

Команда JMP

Команда JMP (jump unconditionally − перейти безусловно) -безусловный переход без сохранения информации о точке возврата. Эта команда застав­ляет микропроцессор извлечь новую команду из адреса определенного операндом (имя) команды JMP. Формат команды:

JMP имя

Операндимя подчиняется тем же правилам, что и операнд команды CALL. Иначе говоря, он может иметь атрибут NEAR или FAR, быть прямым или косвен­ным.

По умолчанию команда JMP занимает три байта, то есть меткаимяимеет атрибут NEAR, но пять байтов, если она имеет атрибут FAR. Если адрес метки находится не далее минус 128 или плюс 127 байтов от адреса команды JMP, то можно сделать команду JMP двухбайтовой, указав, что ее операнд имеет тип SHORT (short — короткий).

Например, команда JMP SHORT М4 займет два байта. Обычно команда JMP используется для обхода группы команд, которым передается управление из другой части программы.

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

У микропроцессора есть команды, которые позволя­ют ему передавать управление той или иной команде, в зависимости от опре­деленных условий, например, нулевого или единичного значе­ния флага переноса CF. Если условие выполнено, то микропроцессор выполнит переход, в противном случае он продолжит исполнение следующей команды программы.

Условия перехода определяют шесть флагов состояния процессора (CF, AF, ZF, SF, PF, OF).

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

Микропроцессор имеет 18 команд условного перехода. Эти команды позволяют проверить:

· отношения между операндами со знаком (больше − меньше, равны);

· отношения между операндами без знака (выше − ниже, равны);

· состояние арифметических флагов zf, sf, cf, of, pf.

Формат команд условного перехода : Jxx,

гдехх – модификатор обозначающий условия перехода;

метка_перехода – метка точки перехода.

Операнд метка_перехода может находиться только в пределах текущего сегмента кода. Межсегментная передача управления в условных переходах не допускается. Если операнд - однобайтовая структура то переход только на расстояние от –128 до +127 байт от следующей команды, в случае если операнд имеет атрибут Near, то переход на расстояние от – 32768 до 32767 байт.

Все команды переходов разделяют на три группы.

Первая группа

В нее входят команды, которые ставятся после арифметических команд или команд сравнения.

В мнемокодах этих команд определенными буквами описывается тот исход сравнения, при котором надо сделать переход. Обычно применяется набор следующих букв:

· Е − Equal(равно) – для всех типов данных;

· N − Not (нет) – для всех типов данных;

· G – Greater (больше) – для чисел со знаком;

· L − Less (меньше) – для чисел со знаком;

· A – Above (выше) – для чисел без знака;

· B – Below (ниже) – для чисел со знаком.

В таблице 4.1 приведены команды условного перехода первой группы с условиями перехода и состояниями флагов для перехода.

Аббревиатурой оп1, оп2 обозначены операнды команд условной передачи управления.

Таблица 4.1 − Команды условного перехода первой группы

Мнемокод Условие перехода Состояние флагов
JE oп1 = oп2 ZF=1
JNE оп1≠ oп2 ZF=0
JL оп1 < oп2 SF≠ OF
JLE оп1 ≤ oп2 ZF=1 или SF≠ OF
JG оп1 > oп2 SF = OF и ZF = 0
JB оп1 < oп2 СF = 1
JA оп1 > oп2 СА = 0 и ZF = 0
JAE оп1 ≥ oп2 СА =0

Вторая группа

Сюда входят команды, реагирующие на значение определенного флага. В мнемокодах этих команд указывается первая буква проверяемого флага, если переход при единичном значении флага, либо в сочетании с буквой N, если переход при нулевом значении флага. В таблице 4.2 указаны команды второй группы.

Таблица 4.2 – Команды перехода по флагам

Мнемокод Условие перехода Мнемокод Условие перехода
JZ ZF = 1 JNZ ZF = 0
JS SF = 1 JNS SF = 0
JC СF= 1 JNC СF= 0
JO OF = 1 JNO OF = 0
JP PF = 1 JNP PF = 0

Третья группа

В третью группу входит только одна команда, проверяющая состояние регистра СХ. Это команда:

JCXZ метка; Если СХ = 0, перейти на метку.

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

1. ADD AL,BL; Если при сложении возник перенос (СF=1),

JC TOOBIG; то осуществляется переход к метке TOOBIG.

2. SUB AL,BL; Если при вычитании в регистре AL ноль (ZF=1),

JZ ZERO; то осуществляется переход к метке ZERO.

3. СМР AL,BL; Если значения AL и BL одинаковы (ZF=1),

JE ZERO; то осуществляет переход к метке ZERO.

В последнем примере можно было бы использовать эквивалентный мнемокод – JZ, но мнемо­код JE (jump if equal – перейти, если равно) в данном случае более содержателен.

В зависимости от того, проверяется результат операции над числами без знака или над числами со знаком, применяются различные коман­ды условного перехода. Предположим, что требует­ся перейти к метке BXMORE, если содержимое регистра ВХ имеет большее значе­ние, чем содержимое регистра АХ.

Если операнды беззнаковые, томожноиспользовать последовательность следующих команд:

СМР ВХ,АХ; Сравнить содержимое регистров АХ и ВХ.

JA ME; Перейти на метку, если ВХ выше (CF=0).

Если операнды знаковые, то вместо команды JA ME необходимо использовать JG ME.

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

Команда управления циклами - LOOP

Команда управления циклами обеспечивают условные передачи управления при организации циклов.

У микропроцессора 8086 регистр СХ служит счетчиком числа повторений циклов. Команда управления циклами уменьшает содержимое регистра СХ на 1, а затем использует его новое значение для "принятия решения" о выполнении или не выполнении перехода.

Основная команда LOOP(loop until Count complete – повторять цикл до конца счетчика). Формат команды: LOOP MP,

где MP – метка перехода.

Команда уменьшает содержимое регистра СХ на 1, проверяет его на равенство 0 и осуществляет переход на указанную близкую метку в том же сегменте команд в диапазоне минус 128…+127 байтов,если содержимое регистра СХ не равно 0. Содержимое СХ рассматривается как целое число без знака, поэтому максимальное число повторений группы включенных в цикл команд составляет 65536 (если перед входом в цикл СХ = 0). Команда выполняется по следующему алгоритму:

CX := CX – 1, if CX ≠ 0 then go to < метка >

КомандаLoop объединяет действия трех команд:

1. Dec CX; Уменьшить значение СХ на 1 (CX : = CX -1).

2. Cmp CX,0; Сравнить СХ с 0.

3. Jne MP; Если CX ≠ 0, передать управление на метку МР.

Например, для стократного выполнения определенной группы команд можно воспользоваться следующей конструкцией:

MOV СХ ,100; 3агрузить число повторении в СХ.
START: MOV AX, TAB+[SI]; Повторяемая

INC ВХ; группа

. . . ; команд

. . . ; тела цикла .

LOOP START; Если СХ не равен 0, перейти наметку START.
. . .; В противном случае выйти из цикла.

Команда LOOP завершает выполнение цикла только в том случае, если содер­жимое регистра СХ уменьшено до 0.

Наши рекомендации