Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект по МПиМК / Лекция 04.doc
Скачиваний:
160
Добавлен:
15.06.2014
Размер:
415.74 Кб
Скачать

8.7. Инструкции передачи управления

Передача управления осуществляется с помощью инструкций безусловных и условных переходов, вызовов процедур и прерываний (исключений). Безусловный переход (JMP) может быть как внутрисегментным (ближним или коротким), так и межсегментным (дальним). Адрес перехода может непосредственно указывать в команде, а при косвенной адресации адрес перехода находится в регистре или памяти и может иметь дополнительные слагаемые. Короткий переход (short) может передавать управление только на адрес назначения, удаленный от текущего в пределах от –128 до +127 байт, ближний (near) – в пределах сегмента. При дальнем (far) переходе адрес назначения (непосредственный или косвенный) включает новое значение указателя инструкций и значение (или селектор) сегмента кода, обеспечивая доступ к любой точке памяти (в пределах, разрешенных защитой).

Условные переходы в 8086 и 80286 возможны только короткие (8–байтовое смещение), процессоры 386+ допускают переход в пределах 16– или 32–байтного смещения, в зависимости от режима адресации. Условные переходы выполняются по состоянию флагов и/или содержимому регистра CX (ECX). Инструкции циклов комбинируют условный переход с декрементом регистра CX (ECX).

Инструкция вызова процедуры (CALL) передает управление в точку перехода, сохраняя адрес следующей за ней инструкции в стеке. По инструкции возврата (RET) этот адрес восстановится в указатель инструкций (и в CS при дальнем вызове). Как и безусловный переход, вызов и возврат могут быть как внутрисегментным (ближним), так и межсегментным, допуская те же режимы адресации. Инструкции данного типа представлены в таблице 8.8.

Таблица 8.8

Команда

Описание

JMP

~ rel8

~ rel16/rel32

~ r/m16

~ r/m32

~ ptr16:16

~ ptr16:32

~ m16:16

~ m16:32

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

короткий по смещению относительно следующей инструкции

ближний по смещению относительно следующей инструкции

ближний по адресу в r/m16

ближний по адресу в r/m32

дальний по адресу

дальний по адресу

дальний по адресу в m16:16

дальний по адресу в m16:32

Вызовы процедур и прерываний

BOUND reg, mem

Проверка на попадание индекса (reg) в границы массива, заданные двумя смежными словами в памяти: если reg<DS:[mem] или reg>DS:[mem+2/4], выполняется INT5 (286+)

CALL target

Вызов процедуры (8 форм): ближний (по абсолютному, косвенному или относительному адресу) или дальний по абсолютному (прямому или косвенному) адресу

INT i8

Выполнение программного прерывания с номером i8

INTO

Выполнение программного прерывания 4, если OF = 1

IRET

IRETD

Возврат из прерывания при 16–битных операндах;

то же при 32–битных операндах

RET

~ i16

Возврат из процедуры (ближний или дальний)

с коррекцией значения указателя стека после возврата (E)SP=(E)SP+i16

Циклы (счетчик циклов CX при 16–битной адресации, ECX – при 32–битной)

LOOP rel8

(E)CX = (E)CX – 1 и переход, если (E)CX != 0

LOOPE/LOOPZ rel8

(E)CX = (E)CX – 1 и переход, если (E)CX != 0 и ZF = 1

LOOPNE/LOOPNZ rel8

(E)CX = (E)CX – 1 и переход, если (E)CX != 0 и ZF = 0

Условные переходы (rel16/32 только для 386+)

JC rel8 ~ rel16/32

Переход, если перенос (CF = 1)

JE/JZ rel8 ~ rel16/32

Переход, если равно (ZF = 1)

JNC rel8 ~ rel16/32

Переход, если нет переноса (CF = 0)

JNE/JNZ rel8 ~ rel16/32

Переход, если не равно (ZF = 0)

JNP/JPO rel8 ~ rel16/32

Переход, если нечетный паритет, т.е. число единичных бит нечетное (PF = 0)

JP/JPE rel8 ~ rel16/32

Переход, если четный паритет, т.е. число единичных бит четное (PF = 1)

JCXZ rel8 ~ rel16/32

Переход, если CX = 0

JECXZ rel8 ~ rel16/32

Переход, если ECX = 0 (386+)

Условные переходы беззнаковые (rel16/32 только для 386+)

JA/JNBE rel8 ~ rel16/32

Переход, если выше (CF = ZF = 0)

JAE/JNB rel8 ~ rel16/32

Переход, если не ниже (CF = 0)

JB/JNAE rel8 ~ rel16/32

Переход, если ниже (CF = 1)

JBE/JNA rel8 ~ rel16/32

Переход, если не выше (CF ИЛИ ZF = 1)

Условные переходы знаковые (rel16/32 только для 386+)

JG/JNGE rel8 ~ rel16/32

Переход, если больше (SF = OF И ZF)

JGE/JNL rel8 ~ rel16/32

Переход, если больше или равно (SF = OF)

JL/JNGE rel8 ~ rel16/32

Переход, если меньше (ZF != OF)

JLE/JNG rel8 ~ rel16/32

Переход, если меньше или равно (SF != OF или ZF = 0)

JNO rel8 ~ rel16/32

Переход, если нет переполнения (OF = 0)

JNS rel8 ~ rel16/32

Переход, если неотрицательно (SF = 0)

JO rel8 ~ rel16/32

Переход, если переполнение (OF = 1)

JS rel8 ~ rel16/32

Переход, если отрицательно (SF = 1)

Соседние файлы в папке Конспект по МПиМК