Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 / МУ_ЭВМ+ПУ_ч1 / 7-МУ_ЭВМ+ПУ-переходы.docx
Скачиваний:
22
Добавлен:
28.05.2015
Размер:
46.72 Кб
Скачать

Лабораторная работа 7 команды перехода

    1. Цель работы

Изучение команд безусловных и условных переходов.

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

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

Прямой безусловный переход: JMP <метка>

Операнд <метка> - метка команды, на которую надо передать управление:

ПРИМЕР

M: ADD AX, BX

JMP L ; переход «вперед»

...

L: MOV АХ, 0

JMP М ; переход «назад»

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

Если переход «назад», то величина разности при трансляции известна (подсчитывается), если «вперед» - формируется команда (3 байта) длинного перехода. Если заранее известно, что переход «вперед» будет коротким, и жалко терять байт на запись команды, используют оператор SHORT .

ПРИМЕР

JMP L ; длинный переход (3 байта)

JMP SHORT L ; короткий переход (2 байта)

...

L: ...

Если в программе указан оператор SHORT, а переход на самом деле оказался длинным, тогда Ассемблер зафиксирует ошибку.

    1. Команды условного перехода

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

Команды условного перехода: Jxx <метка>

<Метка> указывает команду, на которую надо сделать переход в случае выполнения некоторого условия, обозначенного хх.

7.3.2 При описании условия хх, при котором выполняется переход, используются следующие сокращения:

Е – equal (равно)

N - not (не - отрицание)

G – greater (больше)

для чисел со знаком

L – less (меньше)

А – above (выше, больше)

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

В below (ниже, меньше)

7.3.3. Команды условного перехода делят на три группы:

  1. ставятся после команды сравнения;

  2. реагируют на значение определенного флага;

  3. зависят от значения регистра СХ.

7.3.4 Команда сравнения

Сравнение (compare): CMP op1, op2

Операнды должны быть одного типа, их допустимые комбинации такие же, как у команд пересылки, сложения и вычитания (см. п 5.3).

Команда эквивалентна команде вычитания SUB op1, op2, но вычисленная разность op1 - op2 никуда не записывается. Разность, другими словами соотношение операндов, характеризуется величинами флагов CF, PF, AF, ZF, SF и OF.

Команды, используемые после сравнения, приведены в таблице 7.1.

Таблица 7.1 – Команды условного перехода группы а)

Мнемокод

Содержательное условие для перехода после СМР ор1, ор2

для любых чисел

JE

op1 = op2

JNE

op1 ≠ op2

для чисел со знаком

JL / JNGE

op1 < op2

JLE / JNG

op1 ≤ op2

JG / JNLE

op1 > op2

JGE / JNL

op1 ≥ op2

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

JB / JNAE

op1 < op2

JBE / JNA

op1 ≤ op2

JA / JNBE

op1 > op2

JAE / JNB

op1 ≥ op2

7.3.5 Команды, выполнение которых зависят от значений флагов, перечислены в таблице 7.2

Таблица 7.2 – Команды условного перехода группы b)

Мнемокод

Условие перехода

Мнемокод

Условие перехода

JZ

ZF=1

JNZ

ZF=0

JS

SF=1

JNS

SF=0

JC

CF=1

JNC

CF=0

JO

OF=1

JNO

OF=0

JP

PF=1

JNP

PF=0

Замечание: следующие пары мнемокодов эквивалентны: JE и JZ, JNE и JNZ.

ПРИМЕР

Протестировать состояние бита номер нуль регистра AL.

TEST AL, 00000001b

Результат операции – 00000001b (выполняется поразрядное умножение - and, но сам результат никуда не записывается, изменяется флаг нуля ZF).

Маска (шаблон) подобрана так, что все не интересующие нас биты в результате будут нулевыми (умножаются на нуль - 00000001b). Бит номер нуль в результате будет таким, каков он в регистре AL (он умножается на 1 - 00000001b).

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

если бит =0, то результат =0 → ZF=1

если бит =1, то результат ≠0 → ZF=0

Программе доступен только флаг ZF. Именно его величина используется для организации условного перехода, например:

JZ bit0 – перейти на метку bit0, если ZF=1 (т.е. когда бит =0);

JNZ bit1 - перейти на метку bit1, если (not(ZF))=1, а значит ZF=0 (т.е. когда бит =1).

Эти логические цепочки позволяют на практике действовать следующим образом.

Команду JZ bit0 читаем:

прыгай (J – jump) на метку bit0, если бит (Z – zero) равен нулю.

Команду JNZ bit1 читаем:

прыгай (J – jump) на метку bit1, если бит (NZ – not zero) не равен нулю.

7.3.6 Одна команда, выполнение которой зависит от значения регистра СХ:

JCXZ <метка>

Переход выполняется, если регистр СХ равен нулю (jump if CX is zero).

7.3.7 С помощью команд условного перехода можно передать управление не далее, чем на 127-128 байтов вперед или назад. Это примерно 30-40 команд (в среднем одна команда занимает 3-4 байта). Для осуществления «дальних» условных переходов надо привлекать команду безусловного перехода.