Основные непривилегированные команды
Процессоров 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 (побитовое исключающее ИЛИ) |