
- •Тема 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.9. Инструкции работы с флагами
Операции с флагами позволяют изменять значения отдельных флагов, а также сохранять их значения в стеке (или регистре AH) и восстанавливать сохраненные значения (см. таблицу 8.10).
Таблица 8.10
Команда |
Описание |
CLC |
Сброс флага переноса (CF = 0) |
CLD |
Сброс флага направления (DF = 0 – инкремент (E)SI, (E)DI) |
CLI |
Запрет маскируемых аппаратных прерываний (IF = 0) |
CMC |
Инверсия флага переноса (CF = 1 – CF) |
LAHF |
Загрузка флагов (SF:ZF:0:AF:0:PF:0:CF) в регистр AH |
POPF |
Извлечение данных из стека в регистр флагов (EFLAGS[15–0]) |
POPFD |
Извлечение данных из стека в расширенный регистр флагов EFLAGS |
PUSHF |
Помещение в стек регистра флагов (EFLAGS[15–0]) |
PUSHFD |
Помещение в стек расширенного регистра флагов EFLAGS |
SAHF |
Загрузка флагов (SF, ZF, AF, PF, CF) из бит 7, 6, 4, 2, 0 регистра AH |
STC |
Установка флага переноса |
STD |
Установка флага направления (DF = 1 – декремент (E)SI, (E)DI) |
STI |
Разрешение маскируемых аппаратных прерываний (IF = 1) |
8.10. Инструкции загрузки указателей
Инструкции позволяют загружать дальние указатели из памяти в регистр общего назначения и соответствующий сегментный регистр (см. таблицу 8.11).
Таблица 8.11
Команда |
Описание |
LDS r16, m16:16 ~ r32, m16:32 |
Загрузка дальнего указателя из памяти в DS:r16 в DS:r32 |
LES r16, m16:16 ~ r32, m16:32 |
Загрузка дальнего указателя из памяти в ES:r16 в ES:r32 |
LFS r16, m16:16 ~ r32, m16:32 |
Загрузка дальнего указателя из памяти в FS:r16 в FS:r32 |
LGS r16, m16:16 ~ r32, m16:32 |
Загрузка дальнего указателя из памяти в GS:r16 в GS:r32 |
LSS r16, m16:16 ~ r32, m16:32 |
Загрузка дальнего указателя из памяти в SS:r16 в SS:r32 |
8.11. Разные инструкции
В таблице 8.12 собраны инструкции не вошедшие ни в один из перечисленных классов. Инструкция ENTER служит для подготовки вызовов процедур (с поддержкой вложенности) в языках высокого уровня. Она выделяет область переменных в стеке. Обратная инструкция LEAVE восстанавливает исходное значение указателя стека.
Таблица 8.12
Команда |
Описание |
CPUID |
Получение информации о процессоре в EAX, EBX, ECX, EBX. Параметр вызова (номер функции) задается в EAX (P5+) |
LEA r16, m ~ r32, m |
Загрузка эффективного адреса m в регистр r16/32 |
XLAT/XLATB |
Перекодирование содержимого AL в значение из таблицы трансляции, адресуемой в (E)BX: AL = ES:[(E)BX + (AL)] |
NOP |
Нет операции |
UD2 |
Неопределенные 2–байтные инструкции (вызывают исключение #UD) |
ENTER i16:18 |
Выделение блока параметров в стеке |
LEAVE |
Освобождение блока параметров в стеке (действия, обратные ENTER восстанавливаются (E)SP и (E)BP) |