Основные непривилегированные команды
Процессоров Intel 80х86
Условные обозначения:
P1, P2, P3 – операнды команд (чтобы определить их количество).
В столбце «комбинации операндов» даны их допустимые сочетания. В большинстве случаев разрядность операндов должна совпадать или соответствовать друг другу.
r – регистр общего назначения 8-,16- или 32-разрядный: EAX,AX,AL,AH,
EBX,BX,BL,BH, ECX,CX,CL,CH, EDX,DX,DL,DH, ESI,SI, EDI,DI, ESP,SP, EBP,BP
sr – сегментный регистр: CS, SS, DS, ES, FS, GS
const – числовая константа
m – операнд в памяти (адресация прямая или косвенная)
Команды пересылки и загрузки
Команда | Комбинации операндов P1,P2,P3 | Действие | Какие флаги меняет | Какие процессоры | Расшифровка мнемоники команды |
MOV P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32,m8/16/32 m8/16/32, r8/16/32 m8/16/32, const sr, r16 sr, m16 | P1P2 | – | все | Move |
MOVZX P1,P2 | r16/32, r8/16/32 r16/32, m8/16/32 | P1 (00..0)P2 | – | 386 > | Move with Zero extension |
MOVSX P1,P2 | r16/32, r8/16/32 r16/32, m8/16/32 | P1 (ss..s)P2 s – бит знака P2 | – | 386 > | Move with Sign extension |
XCHG P1,P2 | r8/16/32, r8/16/32 r8/16/32,m8/16/32 | P1↔P2 | – | все | Exchange |
BSWAP P1 | r32 | P1[7:0]↔P1[31:24] P1[15:8]↔P1[23:16] | – | 486 > | Byte Swap |
CBW | AX (ss..s)AL s – бит знака AL | – | все | Convert Byte to Word | |
CWD | DX.AX (ss..s)AX s – бит знака AХ | – | все | Convert Word to DoubleWord | |
CWDE | EAX (ss..s)AX s – бит знака AX | – | 386 > | Convert Word to Dword Extended | |
CDQ | EDX.EAX (s..s)EAX s – бит знака EAX | – | 386 > | Convert Dword to Quadra word | |
PUSH P1 | r16/32 m16/32 const sr | добавить P1 в стек: use16: (E)SP (E)SP–2 use32: (E)SP (E)SP–4 SS:[(E)SP] P1 | – | все | Push (англ. "толкать") |
POP P1 | r16/32 m16/32 sr (кроме CS) | извлечь из стека в Р1: P1 SS:[(E)SP] use16: (E)SP (E)SP+2 use32: (E)SP (E)SP+4 | – | все | Pop (англ. жарг. "извлекать") |
PUSHA | добавить в стек: AX,CX, DX,BX,SP,BP,SI,DI | – | все | Push All general registers | |
POPA | извлечь из стека: DI,SI, BP,SP,BX,DX,CX,AX | – | все | Pop All general registers | |
PUSHAD | добавить в стек: EAX,ECX, EDX,EBX,ESP,EBP,ESI,EDI | – | 386 > | Push All general Double word registers | |
POPAD | извлечь из стека: EDI,ESI, EBP,ESP,EBX,EDX,ECX,EAX | – | 386 > | Pop All general Double word registers | |
LEA P1,P2 | r16/32, m | P1 offset(P2) | – | все | Load Effective Address |
LSS P1,P2 LDS P1,P2 LES P1,P2 LFS P1,P2 LGS P1,P2 | r16, m32 | P1 P2[15:0], SS/DS/ES/FS/GS P2[31:16] | – | все все все 386 > 386 > | Load Pointer into SS Load Pointer into DS Load Pointer into ES Load Pointer into FS Load Pointer into GS |
r32, m48 | P1 P2[31:0], SS/DS/ES/FS/GS P2[47:32] | ||||
IN P1,P2 | AL/AX/EAX, const AL/AX/EAX, DX | чтение из порта P1 port[P2] | – | все | IN |
OUT P1,P2 | const, AL/AX/EAX DX, AL/AX/EAX | запись в порт port[P1] P2 | – | все | OUT |
XLAT XLATB | Табличное преобразование: массив байт по адр. ES:[BX] с индексом [AL] → AL | – | все | Translate Byte from Table | |
CMOVZ P1,P2 CMOVE P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | if (ZF=1): P1P2 | – | P6 > | Condition Move if Zero / Equal |
CMOVNZ P1,P2 CMOVNE P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | if (ZF=0): P1P2 | – | P6 > | Condition Move if Not Zero / Not Equal |
CMOVS P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | if (SF=1): P1P2 | – | P6 > | Condition Move if Sign |
CMOVNS P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | if (SF=0): P1P2 | – | P6 > | Condition Move if Not Sign |
CMOVP P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | if (PF=1): P1P2 | – | P6 > | Condition Move if Parity |
CMOVNP P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | if (PF=0): P1P2 | – | P6 > | Condition Move if Not Parity |
CMOVO P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | if (OF=1): P1P2 | – | P6 > | Condition Move if Overflow |
CMOVNO P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | if (OF=0): P1P2 | – | P6 > | Condition Move if Not Overflow |
CMOVA P1,P2 CMOVNBE P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | Усл. пересылка по >(беззнак.) if (CF=0 && ZF=0): P1P2 | – | P6 > | Condition Move if Above / Not Below or Equal |
CMOVAE P1,P2 CMOVNB P1,P2 CMOVNC P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | Усл. пересылка по ³(беззнак.) if (CF=0): P1P2 Усл. пересылка по CF=0 | – | P6 > | Condition Move if Above or Equal / Not Below / if Not Carry |
CMOVB P1,P2 CMOVNAE P1,P2 CMOVC P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | Усл. пересылка по <(беззнак.) if (CF=1): P1P2 Усл. пересылка по CF=1 | – | P6 > | Condition Move if Below / Not Above or Equal / if Carry |
CMOVBE P1,P2 CMOVNA P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | Усл. пересылка по £(беззнак.) if (CF=1 && ZF=1): P1P2 | – | P6 > | Condition Move if Below or Equal / Not Above |
CMOVG P1,P2 CMOVNLE P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | Усл.пересылка по >(знаковое) if (ZF=0 && SF=OF): P1P2 | – | P6 > | Condition Move if Greater / Not Less or Equal |
CMOVGE P1,P2 CMOVNL P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | Усл.пересылка по ³(знаковое) if (SF=OF): P1P2 | – | P6 > | Condition Move if Greater or Equal / Not Less |
CMOVL P1,P2 CMOVNGE P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | Усл.пересылка по <(знаковое) if (SF<>OF): P1P2 | – | P6 > | Condition Move if Less / Not Greater or Equal |
CMOVLE P1,P2 CMOVNG P1,P2 | r8/16/32, r8/16/32 r8/16/32, m8/16/32 | Усл.пересылка по £(знаковое) if (ZF=1 && SF<>OF): P1P2 | – | P6 > | Condition Move if Less or Equal / Not Greater |
Целочисленная арифметика
|
|
Команда | Комбинации операндов P1,P2,P3 | Действие | Какие флаги меняет | Какие процессоры | Расшифровка мнемоники команды |
INC P1 | r8/16/32 m8/16/32 | P1 P1+1 | SF,ZF,PF,AF,OF | все | Increment |
DEC P1 | r8/16/32 m8/16/32 | P1 P1–1 | SF,ZF,PF,AF,OF | все | Decrement |
NEG P1 | r8/16/32 m8/16/32 | P1 (–P1) | SF,ZF,PF,AF,OF, CF=0 | все | Negative |
ADD P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32, m8/16/32 m8/16/32, r8/16/32 m8/16/32, const | P1 P1+P2 | SF,ZF,PF,CF,AF,OF | все | Addition |
ADC P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32, m8/16/32 m8/16/32, r8/16/32 m8/16/32, const | P1 P1+P2+CF | SF,ZF,PF,CF,AF,OF | все | Addition with Carry |
XADD P1,P2 | r8/16/32, r8/16/32 m8/16/32, r8/16/32 | P1↔P2, P1P1+P2 | SF,ZF,PF,CF,AF,OF | 486 > | Exchange and Add |
SUB P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32, m8/16/32 m8/16/32, r8/16/32 m8/16/32, const | P1 P1–P2 | SF,ZF,PF,CF,AF,OF | все | Subtraction |
SBB P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32, m8/16/32 m8/16/32, r8/16/32 m8/16/32, const | P1 P1–P2–CF | SF,ZF,PF,CF,AF,OF | все | Subtraction with Borrow |
MUL P1 | r8/16/32 m8/16/32 | 1 байт: AX P1*AL 2 байта: DX.AX P1*AX 4 байта: EDX.EAX P1*EAX | SF,ZF,PF,AF не опред. Если старш.. половина рез-та в AH/DX/EDX =0, то CF=OF=0 ¹0 то CF=OF=1 | все | Multiplication |
IMUL P1 | r8/16/32 m8/16/32 | 1 байт: AX P1*AL 2 байта: DX.AX P1*AX 4 байта: EDX.EAX P1*EAX | SF,ZF,PF,AF не опред. Если размер результата = размеру операндов, то CF=OF=0 иначе (>) CF=OF=1 | все | Integer Multiplication |
IMUL P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32, m8/16/32 | P1 P1*P2 | 386 > | ||
IMUL P1,P2,P3 | r8/16/32, r8/16/32, const r8/16/32, m8/16/32, const | P1 P2*P3 | 286 > | ||
DIV P1 | r8 m8 | AX/P1→ в AL частное, в AH остаток | Не определены: SF,ZF,PF,CF,AF,OF | все | Division |
r16 m16 | DX.AX/P1→в AX частное, в DX остаток | ||||
r32 m32 | EDX.EAX/P1→в EAX частное, в EDX остаток | ||||
IDIV P1 | r8 m8 | AX/P1→ в AL частное, в AH остаток | Не определены: SF,ZF,PF,CF,AF,OF | все | Integer division |
r16 m16 | DX.AX/P1→в AX частное, в DX остаток | ||||
r32 m32 | EDX.EAX/P1→в EAX частное, в EDX остаток | ||||
CMP P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32, m8/16/32 m8/16/32, r8/16/32 m8/16/32, const | (P1–P2) влияет только флаги | SF,ZF,PF,CF,AF,OF | все | Compare |
CMPXCHG P1,P2 | r8, AL m8, AL | if (P1=AL): P1P2 else AL P1 | SF,ZF,PF,CF,AF,OF | 486 > | Compare and exchange |
r16, AX m16, AX | if (P1=AX): P1P2 else AX P1 | ||||
r32, EAX m32, EAX | if (P1=EAX): P1P2 else EAX P1 | ||||
CMPXCHG8B P1 | m64 | If (P1 = EDX.EAX): P1 EDX.EAX else EDX.EAX P1 | ZF | P5 > | Compare and exchange 8 bytes |
|
Логические команды
Команда | Комбинации операндов P1,P2,P3 | Действие | Какие флаги меняет | Какие процессоры | Расшифровка мнемоники команды |
NOT P1 | r8/16/32 m8/16/32 | ____ P1 P1 | – | все | NOT (побитовое НЕ) |
AND P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32,m8/16/32 m8/16/32, r8/16/32 m8/16/32, const | P1 P1 & P2 | SF,ZF,PF, CF=0, OF=0 | все | AND (побитовое И) |
TEST P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32,m8/16/32 m8/16/32, r8/16/32 m8/16/32, const | (P1& P2) только устанавливает флаги | SF,ZF,PF, CF=0, OF=0 | все | TEST (логическое сравнение) |
OR P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32,m8/16/32 m8/16/32, r8/16/32 m8/16/32, const | P1 P1 | P2 | SF,ZF,PF, CF=0, OF=0, AF не определен | все | OR (побитовое ИЛИ) |
XOR P1,P2 | r8/16/32, r8/16/32 r8/16/32, const r8/16/32,m8/16/32 m8/16/32, r8/16/32 m8/16/32, const | P1 P1 ^ P2 | SF,ZF,PF, CF=0, OF=0, AF не определен | все | Exclusive OR (побитовое исключающее ИЛИ) |