Базовую систему команд микропроцессора можно условно разделить на несколько групп по функциональному назначению (см. табл.8).
· команды передачи данных
· команды работы со стеком
· команды ввода-вывода
· арифметические команды
· логические команды
· сдвиговые команды
· команды управления флагами
· команды прерываний
· команды передачи управления
· команды поддержки языков высокого уровня
· команды синхронизации работы процессора
· команды обработки цепочки бит
· строковые команды
· команды управления защитой (не рассматриваются)
· команды управления кэшированием (не рассматриваются)
Кроме базовой системы команд процессора существуют также команды расширений:
X87 – расширение, содержащее команды математического сопроцессора (работа с вещественными числами)
MMX – расширение, содержащее команды для кодирования/декодирования потоковых аудио/видео данных;
SSE – расширение включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных;
SSE2 – модификация SSE, содержит инструкции для потоковой обработки целочисленных данных, что делает это расширение более предпочтительным для целочисленных вычислений, нежели использование набора инструкций MMX, появившегося гораздо раньше;
SSE3, SSE4 – содержат дополнительные инструкции расширения SSE.
В таблице приняты следующие обозначения
r – регистр
m – ячейка памяти
c – константа
8, 16, 32 – размер в битах
W – запись бита в регистре признаков
U – значение бита в регистре признаков неизвестно после выполнения операции
- – значение бита в регистре признаков не изменилось
+ – значение бита в регистре признаков меняется в соответствии с результатом
На все базовые команды процессора накладываются следующие ограничения:
1. Нельзя в одной команде оперировать двумя областями памяти одновременно. Если такая необходимость возникает, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения.
2. Нельзя оперировать сегментным регистром и значением непосредственно из памяти. Поэтому для выполнения такой операции нужно использовать промежуточный объект. Это может быть регистр общего назначения или стек.
3. Нельзя оперировать двумя сегментными регистрами. Это объясняется тем, что в системе команд нет соответствующего кода операции. Но необходимость в таком действии часто возникает. Выполнить такую пересылку можно, используя в качестве промежуточных регистры общего назначения. Например,
mov ax,ds
mov es,ax; es=ds
4. Нельзя использовать сегментный регистр CS в качестве операнда приемника, поскольку в архитектуре микропроцессора пара CS:EIP всегда содержит адрес команды, которая должна выполняться следующей. Изменение содержимого регистра CS фактически означало бы операцию перехода, а не модификации, что недопустимо.
5. Операнды команды, если это не оговаривается дополнительно в описании команды, должны быть одного размера.
Перестановка байтов из порядка "младший – старший" в порядок "старший – младший". (c 486 проц.)
MOVSX
r16,r/m8 r32,r/m8 r32,r/m16
-
-
-
-
-
-
-
-
-
r16,r/m8 DW ← DB
r32,r/m8 DD ← DB
r32,r/m16 DD ← DW
Пересылка с расширением формата и дублированием знакового бита (с 386 проц.)
MOVZX
r16,r/m8 r32,r/m8 r32,r/m16
-
-
-
-
-
-
-
-
-
r16,r/m8 DW ← DB
r32,r/m8 DD ← DB
r32,r/m16 DD ← DW
Пересылка с расширением формата и дублированием нулевого бита (с 386 проц.)
XLAT
XLATB
m8
-
-
-
-
-
-
-
-
-
AL=DS:[(E)BX + unsigned AL]
Загрузить в AL байт из таблицы в сегменте данных, на начало которой указывает EBX (ВХ); начальное значение AL играет роль смещения.
LEA
r16, m
r32, m
-
-
-
-
-
-
-
-
-
r16=offset m
r32=offset m
Загрузка эффективного адреса.
LDS
r16,m16
r32,m16
-
-
-
-
-
-
-
-
-
DS:r=offset m
Загрузить пару регистров из памяти.
LSS
SS:r=offset m
LES
ES:r=offset m
LFS
FS:r=offset m
LGS
GS:r=offset m
Команды установки единичного значения
SETA
SETNBE
r/m8
-
-
-
-
-
-
-
-
-
CF=0 и ZF=0
Проверяет условие состояния битов регистра EFLAGS и если условие выполняется, то первый бит байта устанавливается в 1, в противном случае в 0. Условия аналогичны условным переходам (je, jc). Например, SETE AL. (с 386 микропроцессора)
SETAE
SETNB
SETNC
-
-
-
-
-
-
-
-
-
CF=0
SETB
SETC
SETNAE
-
-
-
-
-
-
-
-
-
CF=1
SETBE
SETNA
-
-
-
-
-
-
-
-
-
CF=1 или ZF=1
SETE
SETZ
-
-
-
-
-
-
-
-
-
ZF=1
SETG
SETNLE
-
-
-
-
-
-
-
-
-
ZF=0 и SF=OF
SETGE
SETNL
-
-
-
-
-
-
-
-
-
SF=OF
SETL
SETNGE
-
-
-
-
-
-
-
-
-
SF<>OF
SETLE
SETNG
-
-
-
-
-
-
-
-
-
ZF=1 или SF<>OF
SETNE
SETNZ
-
-
-
-
-
-
-
-
-
ZF=0
SETNO
-
-
-
-
-
-
-
-
-
OF=0
SETNP
SETPO
-
-
-
-
-
-
-
-
-
PF=0
SETNS
-
-
-
-
-
-
-
-
-
SF=0
SETO
-
-
-
-
-
-
-
-
-
OF=1
SETP
SETPE
-
-
-
-
-
-
-
-
-
PF=1
SETS
-
-
-
-
-
-
-
-
-
SF=1
Команды работы со стеком
PUSH
r/m32
c32
r/m16
-
-
-
-
-
-
-
-
-
ESP=ESP-4; SS:ESP=r/m32/c
SP=SP-2; SS:SP=r/m16
Поместить в стек двойное слово (слово).
POP
PUSHA
PUSHAD
r/m32
r/m16
-
-
-
-
-
-
-
-
-
-
r/m32=SS:ESP
ESP=ESP+4
r/m16=SS:SP; SP=SP+4
16-разр.
32-разр.
Извлечь из стека двойное слово (слово).
Поместить в стек регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP. (с 386 проц.)
POPA
POPAD
-
-
-
-
-
-
-
-
-
-
16-разр.
32-разр.
Извлечь из стека регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP. (с 386 проц.)
PUSHF
-
W
W
W
W
W
W
W
W
W
Поместить в стек регистр EFLAGS
POPF
-
W
W
W
W
W
W
W
W
W
Извлечь из стека регистр EFLAGS
Команды ввода-вывода
IN
AL,c8
AX,c8 EAX,c8 AL,DX AX,DX EAX,DX
-
-
-
-
-
-
-
-
-
AL= port byte
AX= port word
EAX= port dword
AL= [DX-port]
AX= [DX-port]
EAX= [DX-port]
Ввод из порта
OUT
c8, AL c8, AX
c8, EAX DX, AL DX, AX DX, EAX
-
-
-
-
-
-
-
-
-
port byte=AL
port word=AX
port dword=EAX
[DX-port]=AL
[DX-port]=AX
[DX-port]=EAX
Вывод в порт
INSB
INSW
INSD
-
-
-
-
-
-
-
-
-
-
ES:(E)DI = [DX-port]
Выводит данные из порта, адресуемого DX в ячейку памяти ES:[(E)DI]. После ввода байта, слова или двойного слова производится коррекция EDI/DI на 1,2,4. При наличии префикса REP процесс продолжается, пока СХ>0.
OUTSB
OUTSW
OUTSD
-
-
-
-
-
-
-
-
-
-
[DX-port]=DS:(E)DI
Вводит данные из ячейки памяти, определяемой регистрами DS:[(E)SI], в выходной порт, адрес которого находится в регистре DX. После вывода данных производится коррекция указателя ESI/SI на 1,2,4.
метка
адрес - в r/m16 near
адрес - в r/m32 near
far
far
far
far
Безусловный переход. При работе в Windows используется в основном внутрисегментный переход (NEAR) в пределах 32-битного сегмента.
CALL
label
r/m
ptr
-
-
-
-
-
-
-
-
-
Вызов процедуры
RET
-
c16
-
-
-
-
-
-
-
-
-
Удалить с байт из стека
Возврат из процедуры
LOOP
label
-
-
-
-
-
-
-
-
-
CX=CX-1;
If(CX!=0) EIP=label;
Переход если CX!=0
LOOPE
LOOPZ
label
-
-
-
-
-
-
-
-
-
CX=CX-1;
If(CX!=0 & ZF=1) EIP=label;
Переход если равно ZF=1
LOOPNE
LOOPNZ
label
-
-
-
-
-
-
-
-
-
CX=CX-1;
If(CX!=0 & ZF=0) EIP=label;
Переход если не равно ZF=0
JCXZ
label
-
-
-
-
-
-
-
-
-
if(CX==0)
EIP=label;
Переход если CX=0
JC
label
-
-
-
-
-
-
-
-
-
if(CF==1)
EIP=label;
Переход при переносе
JNC
label
-
-
-
-
-
-
-
-
-
if(CF==0) EIP=label;
Переход при отсутствии переноса
JS
label
-
-
-
-
-
-
-
-
-
if(SF==1) EIP=label;
Переход при отрицательном результате
JNS
label
-
-
-
-
-
-
-
-
-
if(SF==0) EIP=label;
Переход при положительном результате
JE
JZ
label
-
-
-
-
-
-
-
-
-
if(ZF==1) EIP=label;
Переход при нулевом результате
JNE
JNZ
label
-
-
-
-
-
-
-
-
-
if(ZF==0) EIP=label;
Переход при ненулевом результате
JP
JPE
label
-
-
-
-
-
-
-
-
-
if(PF==1) EIP=label;
Переход, если PF=1
JNP
JPO
label
-
-
-
-
-
-
-
-
-
if(PF==0) EIP=label;
Переход, если PF=0
JO
label
-
-
-
-
-
-
-
-
-
if(OF==1) EIP=label;
Переход при переполнении
JNO
label
-
-
-
-
-
-
-
-
-
if(OF==0) EIP=label;
Переход при отсутствии переполнения
Беззнаковые переходы
JB
JNAE
label
-
-
-
-
-
-
-
-
-
cmp m1,m2 if(CF==1)//m1<m2
EIP=label;
Переход если ниже
операнд1<операнд2
JBE
JNA
label
-
-
-
-
-
-
-
-
-
cmp m1,m2 if(CF==1|ZF==1)
//m1<=m2
EIP=label;
Переход если ниже или равно
операнд1<=операнд2
JAE
JNB
label
-
-
-
-
-
-
-
-
-
cmp m1,m2 if(CF==0)
//m1>=m2
EIP=label;
Переход если выше или равно
операнд1>=операнд2
JA/JNBE
label
-
-
-
-
-
-
-
-
-
cmp m1,m2 if(CF==0&ZF==0)
//m1>m2
EIP=label;
Переход если выше
операнд1>операнд2
Знаковые переходы
JL
JNGE
label
-
-
-
-
-
-
-
-
-
cmp m1,m2 if(SF^OF)//m1<m2
EIP=label;
Переход если меньше
операнд1<операнд2
JLE
JNG
label
-
-
-
-
-
-
-
-
-
cmp m1,m2 if((SF^OF) | ZF)
//m1<=m2
EIP=label;
Переход если меньше
или равно
операнд1<=операнд2
JGE
JNL
label
-
-
-
-
-
-
-
-
-
cmp m1,m2 if(SF==OF)
//m1>=m2
EIP=label;
Переход если больше или равно
операнд1>=операнд2
JG
JNLE
label
-
-
-
-
-
-
-
-
-
cmp m1,m2 if(SF==OF &!ZF)
//m1>m2
EIP=label;
Переход если больше
операнд1>операнд2
Команды поддержки языков высокого уровня
ENTER
c16,0
c16,1
c16,c8
-
-
-
-
-
-
-
-
-
PUSH EBP
MOV EBP, ESP
Подготовка стека при входе в процедуру. Константа с16 указывает количество байт, резервируемых в стеке для локальных идентификаторов, константа 0, 1,…31 определяется вложенностью процедур
infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.238.161 (0.992 с.)