- •Тема 4 Программная модель микропроцессоров архитектуры ia-32
- •1. Особенности архитектуры ia-32
- •2. Структура микропроцессоров ia-32
- •3. Регистры
- •4. Формат команды микропроцессора ia-32
- •5. Типы данных
- •6. Пространство памяти
- •7. Режимы адресации
- •8. Система команд
- •8.1. Инструкции пересылки данных
- •8.2. Инструкции двоичной арифметики
- •8.3. Инструкции десятичной арифметики
- •8.4. Инструкции логических операций
- •8.5. Инструкции сдвигов
- •8.6. Инструкции обработки бит и байт
- •8.7. Инструкции передачи управления
- •8.8. Инструкции строковых операций
- •8.9. Инструкции работы с флагами
- •8.10. Инструкции загрузки указателей
- •8.11. Разные инструкции
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) |