Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_lek_OAiP_Meleshko.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
377.68 Кб
Скачать

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

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

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

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

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

Место, куда необходимо передать управление обозначается при помощи меток. Метка – это символическое имя, обозначающее определённую ячейку памяти и предназначенное для использования в качестве операнда в командах передачи управления.

Как и переменной, метке транслятор присваивает три атрибута:

  • имя сегмента кода, где метка описана;

  • смещение (в байтах) от начала сегмента;

  • тип (атрибут расстояния), который может принимать два значения:

    • near – переход на метку возможен только в пределах сегмента кода, в котором она описана, то есть достаточно изменить IP;

    • far – переход на метку возможен в результате межсегментной передачи управления, врезультате изменяется содержимое CS и IP.

Метку можно определить двумя способами:

  • оператором : (двоеточие) – только метку ближнего типа near;

  • директивой LABEL – тип метки при этом может быть как near так и far.

Например:

M1:

mov ax, pole

или

M1 label near

mov ax, pole

Команда безусловного перехода

Синтаксис команды безусловного перехода без сохранения информации о точке возврата:

JMP [модификатор] адрес_перехода

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

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

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

  • отношение между операндами со знаком (больше или меньше);

  • отношение между операндами без знака (выше или ниже);

  • состояниями арифметических флагов ZF, SF, CF, OF, PF (но не AF).

Команды условного перехода имеют одинаковый синтаксис:

JCC метка_перехода

Вместо символов «сс» указывается конкретное условие, анализируемое командой. Что касается операнда метка_перехода, то он определяет метку перехода, которая может находиться только в пределах текущего сегмента кода.

Таблица 10. – Значение аббревиатур в названии команды JCC

Мнемоническое обозначение

Термин

Перевод

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

E

Egual

Равно

Любые

N

Not

Нет

Любые

G

Greater

Больше

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

L

Less

Меньше

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

A

Above

Выше

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

B

Below

Ниже

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

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

  • любая команда, изменяющая состояние арифметических флагов;

  • команда СМР, сравнивающая значения двух операндов;

  • состояние регистра СХ.

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

Команда сравнения СМР (СоМРаге) имеет интересный принцип работы. Команда СМР так же, как и команда SUB, выполняет вычитание операндов и по результатам сравнения устанавливает флаги. Единственное, чего она не делает, — не записывает результат вычитания на место первого операнда.

Синтаксис команды СМР:

сmр операнд_1,операнд_2

Флаги, устанавливаемые командой СМР, можно анализировать специальными командами условного перехода.

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

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

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

Критерий условного перехода

Значения флагов для перехода

Любые

JE

операнд1=операнд2

ZF=1

Любые

JNE

операнд1<>операнд2

ZF=0

Со знаком

JL / JNGE

операнд1<операнд2

SF<>OF

Со знаком

JLE / JNG

операнд1<=операнд2

SF<>OF или ZF=1

Со знаком

JG / JNLE

операнд1>операнд2

Sf=of и zf=0

Со знаком

JGE / JNL

операнд1>=операнд2

SF=OF

Без знака

JB / JNAE

операнд1<операнд2

CF=1

Без знака

JBE / JNA

операнд1<=операнд2

CF=1 или ZF=1

Без знака

JA / JNBE

операнд1>операнд2

CF=0 и ZF=0

Без знака

JAE / JNB

операнд1>=операнд2

CF=0

Так как команды условного перехода не изменяют флагов, то после одной команды СМР вполне могут следовать несколько команд условного перехода. Это может быть сделано для того, например, чтобы исследовать каждую из альтернативных ветвей: больше, меньше или равно:

.data

mas db dup (?)

.code

cmp mas[si]. 5 ;сравнить очередной элемент массива с 5

je eql ;переход, если элемент mas равен 5

jl low ;переход, если элемент mas меньше 5

jg grt ;переход, если элемент mas больше 5

eql :

low :

grt :

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

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

Таблица 12. Команды условного перехода и флаги

Название флага

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

Значение флага для осуществления перехода

Переноса

JC

CF=1

Паритета

JP

PF=1

Нуля

JZ

ZF=1

Знака

JS

SF=1

Переполнения

JO

OF=1

Переноса

JNC

CF=0

Паритета

JNP

PF=0

Нуля

JNZ

ZF=0

Знака

JNS

SF=0

Переполнения

JNO

OF=0

Команды условного перехода и регистр СХ

Регистр СХ имеет определенное функциональное назначение – он выполняет функции счетчика в командах управления циклами и при работе с цепочками символов.

Синтаксис команд JCXZ (Jump if ex is Zero — переход, если СХ ноль)

jcxz метка_перехода

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]