Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основной текст лекций.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆
    1. Циклические и разветвляющиеся программы

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

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

Инструкция безусловного перехода передаёт управление команде, адрес которой указан в инструкции.

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

Типы переходов:

- переход типа short (короткий) – если адрес перехода находится в пределах от –127 до +128 байт от команды, вызвавшей переход;

- переход типа near (ближний) – если адрес перехода находится в том же сегменте, что и команда, вызвавшей переход;

    • переход типа far (дальний) – если адрес перехода находится в другом сегменте.

Формат команды безусловного перехода:

jmp [< тип > ptr ] операнд

<тип> - тип перехода short (короткий) – смещение 127 байтов вперёд или 128 байтов назад, near (близкий) – смещение в пределах сегмента (64 Кбайта), far (дальний) – в любой сегмент с любым смещением.

ptr – приставка, которую можно перевести как указанный в.

Если тип не задан, по умолчанию принимается near. В таблице 5.5 приведены типы безусловных переходов.

Таблица 5.5

Типы команд безусловного перехода

Название

Мнемоника

Описание

внутрисегментный прямой короткий переход

jmp short <операнд>

IP ← (IP) + 8-битное сме­ще­ние, определяемое операндом

внутрисегментный прямой близкий переход

jmp near ptr <операнд>

IP ← (IP)+16-битное сме­щение, определяемое операндом

внутрисегментный косвенный переход

jmp <адрес операнда>

IP ← 16-битный адрес перехода

Межсегментный прямой далекий переход

jmp far ptr <операнд>

IP ← смещение операнда в сегменте

CS ← адрес сег­мен­та, содержа­ще­го опе­ранд

Межсегментный косвенный далёкий переход

jmp far ptr <адрес опе­ран­да>

IP ← операнд

CS ← адрес операн­да +2

Условный переход

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

Все условные переходы являются короткими, т.е. адрес перехода должен отстоять не далее, чем на - 128 или +127 байтов от первого байта следующей команды. Формат команды:

J<условия перехода> <операнд>

Это набор команд, выполняющих переход, если удовлетворяется соответствующее условие перехода (сс). При использовании после команды cmp, условия приобретают формулировки, соответствующие отношениям между операндами cmp (таблица 5.6).

Таблица 5.6 Значение аббревиатур в названии команды jcc

Обозначение

Англ.

Русский

Тип операндов

e

equal

Равно

любые

n

not

Не

любые

g

greater

Больше

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

l

low

Меньше

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

a

above

Выше (больше)

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

b

bellow

Ниже (меньше)

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

Эти команды осуществляют переходы типа short и near

Таблица 5.7 Перечень команд условного перехода для команды cmp

Условие

Мнемокод

со знаком

без знака

ОП-1 = ОП_2

je equal

ОП-1 < >ОП_2

jne not equal

ОП-1 < ОП_2

jl low

jnge not greater or equal

jb below

jnae not above or equal

ОП-1 <= ОП_2

jle low or equal

jng not greater

jbe below or equal

jna not above

ОП-1 > ОП_2

jg greater

jnle not low or equal

ja above

jnbe not below or equal

ОП-1 => ОП_2

jge greater or equal

jnl not lower

jae above or equal

jnb not below

Циклы

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

loop[<условие повторения цикла>] <метка короткого перехода>

Инструкция loop использует содержимое регистра СХ как счетчик повторений цикла. Команда loop уменьшает содержимое регистра СХ на 1 и передает управление по адресу, определяемому меткой перехода, если содержимое СХ ≠ 0, в противном случае выполняется следующая за LOOP инструкция. Подобно условным переходам инструкции этой группы могут осуществлять только короткие передачи управления, т.е. в пределах от -128 до +127.

Добавление к инструкции loop <условие повторения цикла> позволяет ввести дополнительные логические условия на повторение цикла:

loope/loopz – повторять, пока ноль;

loopne/loopnz – повторять, пока не ноль.

Проверка флага ZF осуществляется командой loop. Цикл повторяется, если содержимое СХ ≠ 0 и выполняется соответствующее условие, в противном случае выполняется следующая за loop инструкция.