Приложение 2. Справочник по командам и архитектуре Pentium
В литературе при описании команд микропроцессоров часто встречаются досадные ошибки. Стараясь избежать таких ошибок, автор выверял описание команд по нескольким источникам [3,5,6,8,9,10]. Часть команд была проверена программным путем.
Список регистров микропроцессора Pentium
Регистры общего назначения
EAX = (16+AX=(AH+AL)) EBX = (16+BX=(BH+BL)) ECX = (16+CX=(CH+CL)) EDX = (16+DX=(DH+DL)) ESI = (16+SI) EDI = (16+DI) EBP = (16+BP) ESP = (16+SP)
Регистры EAX
, EBX
, EDX
,
ECX
называют рабочими регистрами. Регистры EDI
,
ESI
- индексные регистры, играют особую роль в строковых операциях.
Регистр EBP
обычно используется для адресации в стеке параметров и
локальных переменных. Регистр ESP
- указатель стека, автоматически
модифицируется командами PUSH
, POP
, RET
,
CALL
. Явно используется реже.
Регистр флагов. Содержит 32 бита. Вот используемые значения битов.
- 0-й бит, флаг переноса (
CF
), устанавливается в1
если был перенос из старшего бита; - 1-й бит,
1
; - 2-й бит, флаг четности (
PF
). Устанавливается в1
, если младший байт результата содержит четное число единиц. - 3-й бит,
0
; - 4-й бит, флаг вспомогательного переноса (
AF
). Устанавливается в1
, если произошел перенос из третьего бита в четвертый. - 5-й бит,
0
; - 6-й бит, флаг нуля (
ZF
). Устанавливается в единицу, если результат операции ноль; - 7-й бит, флаг знака (
SF
). Равен старшему биту результата; - 8-й бит, флаг ловушки (
TF
). Установка в единицу этого флага приводит к тому, что после каждой команды вызываетсяINT 3
. Используется отладчиками в реальном режиме; - 9-й бит, флаг прерываний (
IF
). Сброс этого флага в0
приводит к тому, что микропроцессор перестает воспринимать прерывания; - 10-й бит, флаг направления (
DF
). Данный флаг учитывается в строковых операциях. Если флаг равен1
, то в строковых операциях адрес автоматически уменьшается; - 11-й бит, флаг переполнения (
OF
). Устанавливается в единицу, если результат операции над числом со знаком вышел за допустимые пределы; - 12,13-й биты, уровень привилегий ввода-вывода (
IOPL
); - 14-бит, флаг вложенной задачи (
NT
); - 15-й бит,
0
; - 16-й бит, флаг возобновления (
RF
). Используется совместно с регистрами точек отладочного останова; - 17-й бит, в защищенном режиме включает режим виртуального режима 8086
(
VM
); - 18-й бит, флаг контроля выравнивания (
AC
). При равенстве этого флага1
и при обращении к невыровненному операнду вызывает исключение17
; - 19-й бит, виртуальная версия флага
IF
(VIF
). Работает в защищенном режиме; - 20-й бит, виртуальный запрос прерывания (
VIP
); - 21-й бит, флаг доступности команды идентификации;
- 22-31-й,
0
;
Сегментные регистры
CS
- сегмент кода,DS
- сегмент
данных,SS
- сегмент
стека,ES
,GS
,FS
- дополнительные
регистры. Сегментные регистры 16-битны.
Управляющие регистры
Регистр CR0
.
- 0-й бит, разрешение защиты (
РЕ
). Переводит процессор в защищенный режим. - 1-й бит, мониторинг сопроцессора (
МР
). Вызывает исключение7
по каждой командеWAIT
. - 2-й бит, эмуляция сопроцессора (
ЕМ
). Вызывает исключение7
по каждой команде сопроцессора. - 3-й бит, бит переключения задач (
TS
). Позволяет определить, относится данный контекст сопроцессора к текущей задаче или нет. Вызывает исключение7
при выполнении следующей команды сопроцессора. - 4-й бит, индикатор поддержки инструкций сопроцессора (
ЕТ
). - 5-й бит, разрешение стандартного механизма сообщений об ошибке сопроцессора
(
NE
). - 5-15-й бит, не используются.
- 16-й бит, разрешение защиты от записи на уровне привилегий супервизора
(
WP
). - 17-й бит, не используется.
- 18-й бит, разрешение контроля выравнивания (
AM
). - 19-28-й бит, не используются.
- 29-й бит, запрет сквозной записи кэша и циклов аннулирования
(
NW
). - 30-й бит, запрет заполнения кэша (
CD
). - 31-й бит, включение механизма страничной переадресации.
Регистр CR1
пока не используется.
Регистр CR2
хранит 32-битный линейный адрес, по которому
был получен последний отказ страницы памяти.
Регистр CR3
- в старших 20 битах хранится физический
базовый адрес таблицы каталога страниц.
Остальные биты.
- 3-й бит, кэширование страниц со сквозной записью (
PWT
). - 4-й бит, запрет кэширование страницы (
PCD
).
Регистр CR4
- 0-й бит, разрешение использования виртуального флага прерываний в режиме
V8086 (
VME
). - 1-й бит, разрешение использования виртуального флага прерываний в защищенном
режиме (
PVI
). - 2-й бит, превращение инструкции RDTSC в привилегированную
(
TSD
). - 3-й бит, разрешение точек останова по обращению к портам ввода-вывода
(
DE
). - 4-й бит, включает режим адресации с 4-мегабайтными страницами
(
PSE
). - 5-й бит, включает 36-битное физическое адресное пространство
(
РАЕ
). - 6-й бит, разрешение исключения
МС
(МСЕ
). - 7-й бит, разрешение глобальной страницы (PGE).
- 8-й бит, разрешает выполнение команды
RDPMC
(РМС
). - 9-й бит, разрешает команды быстрого сохранения/восстановления состояния
сопроцессора (
FSR
).
Системные адресные регистры
GDTR
- 6-байтный регистр, в котором содержится линейный адрес
глобальной дескрипторной таблицы.IDTR
- 6-байтный регистр,
содержащий 32-битный линейный адрес таблицы дескрипторов обработчиков
прерываний.LDTR
- 10-байтный регистр, содержащий 16-битный
селектор (индекс) для GDT и 8-байтный дескриптор.TR
-
10-байтный регистр, содержащий 16-битный селектор для GDT
и весь
8-байтный дескриптор из GDT
, описывающий TSS
текущей
задачи.
Регистры отладкиDR0...DR3
- хранят 32-битные линейные
адреса точек останова.DR6
(равносильно DR4
) -
отражает состояние контрольных точек.DR7
(равносильно
DR5
) - управляет установкой контрольных точек.
MOV dest,src | Пересылка данных в регистр из регистра, памяти или непосредственного
операнда. Пересылка данных в память из регистра или непосредственного операнда.
Например, MOV AX,10; MOV EBX,ESI; MOV AL, BYTE PTR MEM . |
XCHG r/m,r | Обмен данными между регистрами или регистром и памятью. Команда "память - память" в микропроцессоре Intel не предусмотрена. |
BSWAP reg32 | Перестановка байт из порядка "младший - старший" в порядок "старший -
младший". Разряды 7-0 обмениваются с разрядами 31-24 ,
а разряды 15-8 с разрядами 23-16 . Команда появилась в
486-м микропроцессоре. |
MOVSXB r,r/m | Пересылка байта с его расширением до слова или двойного слова с
дублированием знакового бита: MOVSXB AX,BL; MOVSXB EAX,byte ptr
mem . Команда появилась с 386-ого процессора. |
MOVSXW r,r/m | Пересылка слова с расширением до двойного слова с дублированием знакового
бита: MOVSXW EAX,WORD PTR MEM . Команда появилась с 386-ого
процессора. |
MOVZXB r,r/m | Пересылка байта с его расширением до слова или двойного слова с
дублированием нулевого бита: MOVSXB AX,BL; MOVSXB EAX,byte ptr mem .
Команда появилась с 386-ого процессора. |
MOVZXW r,r/m | Пересылка слова с расширением до двойного слова с дублированием нулевого
бита: MOVZXW EAX,WORD PTR MEM . Команда появилась с 386-ого
процессора. |
XLAT | Загрузить в AL байт из таблицы в сегменте данных, на начало
которой указывает EBX (ВХ) , при этом начальное значение
AL играет роль смещения. |
LEA r,m | Загрузка эффективного адреса. Например, LEA EAX,MEM; LEA
EAX,[EBX] . Данная команда обладает магичаскими свойствами, позволяющими
эффективно выполнять арифметические действия. Например, команда LEA
EAX,[EAX*8] умножает содержимое EAX на 8 ,
LEA EAX,[EAX][EAX*4] на 5 , Команда LEA
ECX,[EAX][ESI+5] эквивалента 3(!) командам MOV ECX,EAX/ADD
ECX,ESI/ADD ECX,5 . |
LDS r,m | Загрузить пару DS:reg из памяти. Причем вначале идет слово (или
двойное слово), а в DS - последующее слово. |
LES r,m | Аналогично предыдущему, но для пары ES:reg . |
LFS r,m | Аналогично предыдущему, но для пары FS:reg . |
LGS r,m | Аналогично предыдущему, но для пары GS:reg . |
LSS r,m | Аналогично предыдущему, но для пары SS:reg . |
SETcc r/m | Проверяет условие "cc", если выполняется, то первый бит байта
устанавливается в 1 , в противном случае в 0 . Условия
аналогичны в условных переходах (je, jc ). Например, SETE
AL . Команда появилась с 386-ого микропроцессора. |
LAHF | Загрузить флаги в АН (устарела). |
SAHF | Сохранить АН в регистре флагов
(устарела). |
Команды ввода-вывода
| Ввод в аккумулятор из порта ввода-вывода. Порт адресуется непосредственно
или через регистр DX . |
| Вывод в порт ввода-вывода. Порт адресуется непосредственно или через регистр
DX . |
[REP] INSB | Выводит данные из порта, адресуемого регистром DX в ячейку
памяти ES:[EDI/DI] . После ввода байта, слова или двойного слова
производится коррекция EDI/DI на 1,2,4 . При наличии
префикса REP процесс продолжается, пока содержимое СХ
не станет равным 0 . |
[REP] OUTSB | Выводит данные из ячейки памяти, определяемой регистрами
DS:[ESI/SI] , в выходной порт, адрес которого находится в регистре
DX . После вывода байта, слова, двойного слова производится
коррекция указателя ESI/SI на
1,2,4 . |
Инструкции работы со стеком
PUSH r/m | Поместить в стек слово или двойное слово. Поскольку при включении в стек слова нарушается выравнивание стека по границам двойных слов, рекомендуется в любом случае помещать в стек двойное слово. |
PUSH const | Поместить в стек непосредственный 32-битный операнд. |
PUSHA | Поместить в стек регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP,
ESP . Команда появилась с 386-ого процессора. |
POP reg/mem | Извлечь из стека слово или двойное слово. |
POPА | Извлечение из стека данных в регистры EAX, EBX, ECX, EDX, ESI, EDI,
EBP, ESP . Команда появилась, начиная с 386-ого процессора. |
PUSHF | Помещение в стек регистра флагов. |
POPF | Извлечь данные в регистр флагов. |
Инструкции целочисленной арифметики.
ADD dest,src | Сложение двух операндов. Первый операнд может быть регистром или ячейкой памяти, второй - регистром, ячейкой памяти, константой. Невозможно только, когда оба операнда являются ячейками памяти. |
XADD dest,src | Данная операция производит в начале обмен операндами, а затем выполняет
операцию ADD . Начиная 486-ого. |
ADC dest,src | Сложение с учетом флага переноса - в младший бит добавляется бит (флаг) переноса. |
INC r/m | Инкремент операнда. |
SUB dest,src | Вычитание двух операндов. Остальное аналогично сложению (команда
ADD ). |
SBB dest,src | Вычитание с учетом бита переноса. Из младшего бита вычитается бит (флаг) переноса. |
DEC r/m | Декремент операнда. |
CMP r/m,r/m | Вычитание без изменения операндов (сравнение). |
CMPXCHG r,m,a | Сравнение с обменом. Воспринимает три операнда (регистр-операнд-источник, ячейка памяти-операнд- получатель, аккумулятор, т.е. AL,AX или EAX) Если значения в операнде-получателе и аккумуляторе равны, операнд-получатель заменяется операндом-источником, исходное значение операнда-получателя загружается в аккумулятор. Начиная с 486-ого. |
CMPXCHG8B r,m,a | Сравнение и обмен восьми байт. Начиная с Pentium. |
NEG r/m | Изменение знака операнда. |
ААА | Коррекция после ASCII-сложения. Коррекция результата двоичного сложения двух
неупакованных десятичных чисел. Например, АХ содержит число
9H . Пара команд ADD AL,8/AAA приводит к тому, что в
АХ будет содержаться 0107 , т.е. ASCII-число
17 . |
AAS | Коррекция после ASCII-вычитания. Например:MOV AX,205H;
загрузить ASCII 25 SUB AL,8; двоичное вычитание AAS
; теперь АХ содержит 107Н , т.е.
17 . |
ААМ | Коррекция после ASCII-умножения. Для этой команды предполагается, что в
регистре АХ находится результат двоичного умножения двух десятичных
цифр (диапазон от 0 до 81 ). После выполнения команды
образуется двухбайтное произведение в регистре АХ в
ASCII-формате. |
AAD | Коррекция перед ASCII-делением. Предполагается, что младшая цифра находится
в AL , а старшая - в АН . |
DAA | Коррекция после BCD -сложения.59 |
DAS | Коррекция после ВСD -вычитания. |
MUL r/m | Умножение АL(AX,EAX) на целое беззнаковое число. Результат,
соответственно, будет содержаться в АХ , DX:AX,
EDX:EAX . |
IMUL r/m | Знаковое умножение (аналогично MUL ). Все операнды считаются
знаковыми. Команда IMUL имеет также двухоперандный и трехоперандный
вид. Двухоперандный вид IMUL r,src r<-r*src . Трехоперандный вид
IMUL dst,src,imm dst<-src*imm . |
DIV r/m (src) | Беззнаковое деление. Аналогично беззнаковому умножению. Осуществляет деление
аккумулятора и его расширения (AH:AL, DX:AX, EDX:EAX ) на делитель
src . Частное помещается в аккумуляторе, а остаток - в расширении
аккумулятора. |
IDIV r/m | Знаковое деление. Аналогично беззнаковому. |
CBW | Расширение байта (AL ) в слово с копированием знакового
бита. |
CWD | Расширение слова (АХ ) в двойное слово (DX:AX ) с
копированием знакового бита. |
CWDE | Расширение слова (АХ ) в двойное слово (EAX ) с
копированием знакового бита. |
CDQ | Преобразование двойного слова (EAX ) в учетверенное слово
(EDX:EAX ). |
59 Напоминаю, что ASCII-число предполагает одну
цифру на один байт, BCD-число - одну цифру на половину байта. Т.о. скажем в
регистре АХ
, может находиться двухразрядное ASCII-число и
четырехразрядное BCD-число.
Логические операции.
AND dest,src | Логическая операция "AND ". Обнуление бит dest ,
которые равны нулю у src . |
| Аналогична "AND ", но не меняет dest . Используется
для проверки ненулевых бит. |
OR dest,src | Логическая "ИЛИ ". В dest устанавливаются биты,
отличные от нуля в src . |
XOR dest,src | Исключающее "ИЛИ ". |
NOT dest | Переключение всех бит (инверсия). |
Сдвиговые операции.
Начиная с 386-ого микропроцессора, непосредственный операнд src
может быть не только 1
, но произвольным числом. В ранних версиях
для количества сдвигов использовался регистр CL
.
RCL/RCR dest,src | Циклический сдвиг влево/вправо через бит переноса CF .
Src может быть либо CL , либо непосредственный
операнд. |
ROL/ROR dest,src | Аналогично командам RCL/RCR , но по другому, работает с флагом
CF . Флаг не участвует в цикле, но в него попадает бит, перешедший с
начала на конец или наоборот. |
SAL/SAR dest,src | Сдвиг влево/право. Называется еще арифметическим сдвигом. При сдвиге вправо
дублируется старший бит. При сдвиге влево младший бит заполняется нулем. Ушедший
бит помещается в CF . |
SHL/SHR dest,src | Логический сдвиг влево/вправо. Сдвиг вправо отличается от SAR
тем, что и старший бит заполняется нулем. |
SHLD/SHRD dest,src,count | Трехоперандные команды сдвига влево/вправо. Первым операндом, как обычно,
может быть либо регистр, либо ячейка памяти, вторым операндом должен быть
регистр общего назначения, третьим - регистр CL или
непосредственный операнд. Суть операции заключается в том, что dest
и src в начале объединяются, а потом производится сдвиг на
количество бит count . Результат снова помещается в
dest . |
Строковые операции
REP | Префикс, означающий повтор строковой операции до обнуления ECX .
Префикс имеет также разновидности REPZ (REPE) - выполнять, пока не
нуль (ZF=1 ), REPNZ (REPNE) - выполнять, пока
нуль. |
MOVS dest,src | Команда передает байт, слово или двойное слово из цепочки, адресуемой
DS:[ESI] , в цепочку dest , адресуемую
ES:[EDI] . При этом EDI и ESI
автоматически корректируются согласно значению флага DF .
Допускается явная спецификация MOVSB (byte), MOVSW
(word), MOVSD (dword). Dest и src можно
явно не указывать. |
LODS src | Команда загрузки цепочки в аккумулятор. Имеет разновидности
LODSB , LODSW , LODSD . При выполнении
команды байт, слово, двойное слово загружается соответственно в
AL,AX,EAX . При этом ESI автоматически изменяется на
1 в зависимости от значения флага DF . Префикс
REP не используется. |
STOS dest | Команда, обратная LODS , т.е. передает байт, слово или двойное
слово из аккумулятора в цепочку и автоматически корректирует
EDI . |
SCAS dest | Команда сканирования цепочки. Команда вычитает элемент цепочки
dst из содержимого аккумулятора (AL\AX\EAX ) и
модифицирует флаги. Префикс REPNE позволяет найти в цепочке нужный
элемент. |
CMPS dest,src | Команда сравнения цепочек. Данная команда производит вычитание байта, слова
или двойного слова цепочки dst из соответствующего элемента цепочки
src . В зависимости от результата вычитания модифицируются флаги.
Регистры EDI и ESI автоматически продвигаются на
следующий элемент. При использовании префикса REPE команда означает
- сравнивать, пока не будет, достигнут конец цепочки или пока элементы не будут
равны. При использовании префикса REPNE команда означает -
сравнивать, пока не достигнут конец цепочки или пока элементы будут
равны. |
Команды управления флагами
CLC | Сброс флага переноса. |
CMC | Инверсия флага переноса. |
STC | Установка флага переноса. |
CLD | Сброс флага направления. |
STD | Установка флага направления. |
CLI | Запрет маскируемых аппаратных прерываний. |
STI | Разрешение маскируемых аппаратных прерываний. |
CTS | Сброс флага переключения задач. |