Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Intel 8086 Family Architecture. . . . . . . . . . . . . . . . . . . . . 3
- Instruction Clock Cycle Calculation . . . . . . . . . . . . . . . . . . 3
- 8088/8086 Effective Address (EA) Calculation . . . . . . . . . . . . . 3
- Task State Calculation. . . . . . . . . . . . . . . . . . . . . . . . . 4
- FLAGS - Intel 8086 Family Flags Register. . . . . . . . . . . . . . . . 4
- MSW - Machine Status Word (286+ only) . . . . . . . . . . . . . . . . . 5
- 8086/80186/80286/80386/80486 Instruction Set. . . . . . . . . . . . . . 6
- AAA - Ascii Adjust for Addition. . . . . . . . . . . . . . . . . . 6
- AAD - Ascii Adjust for Division. . . . . . . . . . . . . . . . . . 6
- AAM - Ascii Adjust for Multiplication. . . . . . . . . . . . . . . 6
- AAS - Ascii Adjust for Subtraction . . . . . . . . . . . . . . . . 6
- ADC - Add With Carry . . . . . . . . . . . . . . . . . . . . . . . 7
- ADD - Arithmetic Addition. . . . . . . . . . . . . . . . . . . . . 7
- AND - Logical And. . . . . . . . . . . . . . . . . . . . . . . . . 7
- ARPL - Adjusted Requested Privilege Level of Selector (286+ PM). . 7
- BOUND - Array Index Bound Check (80188+) . . . . . . . . . . . . . 8
- BSF - Bit Scan Forward (386+). . . . . . . . . . . . . . . . . . . 8
- BSR - Bit Scan Reverse (386+) . . . . . . . . . . . . . . . . . . 8
- BSWAP - Byte Swap (486+) . . . . . . . . . . . . . . . . . . 8
- BT - Bit Test (386+) . . . . . . . . . . . . . . . . . . 9
- BTC - Bit Test with Compliment (386+). . . . . . . . . . . . . . . 9
- BTR - Bit Test with Reset (386+) . . . . . . . . . . . . . . . . . 9
- BTS - Bit Test and Set (386+) . . . . . . . . . . . . . . . . . . 9
- CALL - Procedure Call. . . . . . . . . . . . . . . . . . . . . . . 10
- CBW - Convert Byte to Word . . . . . . . . . . . . . . . . . . . . 10
- CDQ - Convert Double to Quad (386+). . . . . . . . . . . . . . . . 10
- CLC - Clear Carry. . . . . . . . . . . . . . . . . . . . . . . . . 11
- CLD - Clear Direction Flag . . . . . . . . . . . . . . . . . . . . 11
- CLI - Clear Interrupt Flag (disable) . . . . . . . . . . . . . . . 11
- CLTS - Clear Task Switched Flag (286+ privileged). . . . . . . . . 11
- CMC - Complement Carry Flag. . . . . . . . . . . . . . . . . . . . 11
- CMP - Compare. . . . . . . . . . . . . . . . . . . . . . . . . . . 12
- CMPS - Compare String (Byte, Word or Doubleword) . . . . . . . . . 12
- CMPXCHG - Compare and Exchange . . . . . . . . . . . . . . . . . . 12
- CWD - Convert Word to Doubleword . . . . . . . . . . . . . . . . . 12
- CWDE - Convert Word to Extended Doubleword (386+). . . . . . . . . 13
- DAA - Decimal Adjust for Addition. . . . . . . . . . . . . . . . . 13
- DAS - Decimal Adjust for Subtraction . . . . . . . . . . . . . . . 13
- DEC - Decrement. . . . . . . . . . . . . . . . . . . . . . . . . . 13
- DIV - Divide . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
- ENTER - Make Stack Frame (80188+) . . . . . . . . . . . . . . . . 14
- ESC - Escape . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
- HLT - Halt CPU . . . . . . . . . . . . . . . . . . . . . . . . . . 14
- IDIV - Signed Integer Division . . . . . . . . . . . . . . . . . . 14
- IMUL - Signed Multiply . . . . . . . . . . . . . . . . . . . . . . 15
- IN - Input Byte or Word From Port. . . . . . . . . . . . . . . . . 15
- INC - Increment. . . . . . . . . . . . . . . . . . . . . . . . . . 16
- INS - Input String from Port (80188+) . . . . . . . . . . . . . . 16
- INT - Interrupt. . . . . . . . . . . . . . . . . . . . . . . . . . 16
- INTO - Interrupt on Overflow . . . . . . . . . . . . . . . . . . . 17
- INVD - Invalidate Cache (486+). . . . . . . . . . . . . . . . . . 17
- INVLPG - Invalidate Translation Look-Aside Buffer Entry (486+) . . 17
- IRET/IRETD - Interrupt Return. . . . . . . . . . . . . . . . . . . 17
- Jxx - Jump Instructions Table. . . . . . . . . . . . . . . . . . . 18
- JCXZ/JECXZ - Jump if Register (E)CX is Zero. . . . . . . . . . . . 18
- JMP - Unconditional Jump . . . . . . . . . . . . . . . . . . . . . 19
- LAHF - Load Register AH From Flags . . . . . . . . . . . . . . . . 19
- LAR - Load Access Rights (286+ protected). . . . . . . . . . . . . 19
- LDS - Load Pointer Using DS. . . . . . . . . . . . . . . . . . . . 20
- LEA - Load Effective Address . . . . . . . . . . . . . . . . . . . 20
- LEAVE - Restore Stack for Procedure Exit (80188+). . . . . . . . . 20
- LES - Load Pointer Using ES. . . . . . . . . . . . . . . . . . . . 20
- LFS - Load Pointer Using FS (386+) . . . . . . . . . . . . . . . . 21
- LGDT - Load Global Descriptor Table (286+ privileged). . . . . . . 21
- LIDT - Load Interrupt Descriptor Table (286+ privileged) . . . . . 21
- LGS - Load Pointer Using GS (386+) . . . . . . . . . . . . . . . . 21
- LLDT - Load Local Descriptor Table (286+ privileged) . . . . . . . 22
- LMSW - Load Machine Status Word (286+ privileged). . . . . . . . . 22
- LOCK - Lock Bus. . . . . . . . . . . . . . . . . . . . . . . . . . 22
- LODS - Load String (Byte, Word or Double). . . . . . . . . . . . . 22
- LOOP - Decrement CX and Loop if CX Not Zero. . . . . . . . . . . . 23
- LOOPE/LOOPZ - Loop While Equal / Loop While Zero . . . . . . . . . 23
- LOOPNZ/LOOPNE - Loop While Not Zero / Loop While Not Equal . . . . 23
- LSL - Load Segment Limit (286+ protected). . . . . . . . . . . . . 23
- LSS - Load Pointer Using SS (386+) . . . . . . . . . . . . . . . . 24
- LTR - Load Task Register (286+ privileged) . . . . . . . . . . . . 24
- MOV - Move Byte or Word. . . . . . . . . . . . . . . . . . . . . . 24
- MOVS - Move String (Byte or Word). . . . . . . . . . . . . . . . . 25
- MOVSX - Move with Sign Extend (386+) . . . . . . . . . . . . . . . 25
- MOVZX - Move with Zero Extend (386+) . . . . . . . . . . . . . . . 25
- MUL - Unsigned Multiply. . . . . . . . . . . . . . . . . . . . . . 25
- NEG - Two's Complement Negation. . . . . . . . . . . . . . . . . . 26
- NOP - No Operation (90h) . . . . . . . . . . . . . . . . . . . . . 26
- NOT - One's Compliment Negation (Logical NOT). . . . . . . . . . . 26
- OR - Inclusive Logical OR. . . . . . . . . . . . . . . . . . . . . 26
- OUT - Output Data to Port. . . . . . . . . . . . . . . . . . . . . 27
- OUTS - Output String to Port (80188+) . . . . . . . . . . . . . . 27
- POP - Pop Word off Stack . . . . . . . . . . . . . . . . . . . . . 27
- POPA/POPAD - Pop All Registers onto Stack (80188+). . . . . . . . 28
- POPF/POPFD - Pop Flags off Stack . . . . . . . . . . . . . . . . . 28
- PUSH - Push Word onto Stack. . . . . . . . . . . . . . . . . . . . 28
- PUSHA/PUSHAD - Push All Registers onto Stack (80188+) . . . . . . 28
- PUSHF/PUSHFD - Push Flags onto Stack . . . . . . . . . . . . . . . 29
- RCL - Rotate Through Carry Left. . . . . . . . . . . . . . . . . . 29
- RCR - Rotate Through Carry Right . . . . . . . . . . . . . . . . . 29
- REP - Repeat String Operation. . . . . . . . . . . . . . . . . . . 30
- REPE/REPZ - Repeat Equal / Repeat Zero . . . . . . . . . . . . . . 30
- REPNE/REPNZ - Repeat Not Equal / Repeat Not Zero . . . . . . . . . 30
- RET/RETF - Return From Procedure . . . . . . . . . . . . . . . . . 31
- ROL - Rotate Left. . . . . . . . . . . . . . . . . . . . . . . . . 31
- ROR - Rotate Right . . . . . . . . . . . . . . . . . . . . . . . . 31
- SAHF - Store AH Register into FLAGS. . . . . . . . . . . . . . . . 32
- SAL/SHL - Shift Arithmetic Left / Shift Logical Left . . . . . . . 32
- SAR - Shift Arithmetic Right . . . . . . . . . . . . . . . . . . . 32
- SBB - Subtract with Borrow/Carry . . . . . . . . . . . . . . . . . 33
- SCAS - Scan String (Byte, Word or Doubleword) . . . . . . . . . . 33
- SETAE/SETNB - Set if Above or Equal / Set if Not Below (386+). . . 33
- SETB/SETNAE - Set if Below / Set if Not Above or Equal (386+). . . 33
- SETBE/SETNA - Set if Below or Equal / Set if Not Above (386+). . . 34
- SETE/SETZ - Set if Equal / Set if Zero (386+). . . . . . . . . . . 34
- SETNE/SETNZ - Set if Not Equal / Set if Not Zero (386+). . . . . . 34
- SETL/SETNGE - Set if Less / Set if Not Greater or Equal (386+) . . 34
- SETGE/SETNL - Set if Greater or Equal / Set if Not Less (386+) . . 35
- SETLE/SETNG - Set if Less or Equal / Set if Not greater or Equal (386+) 35
- SETG/SETNLE - Set if Greater / Set if Not Less or Equal (386+) . . 35
- SETS - Set if Signed (386+). . . . . . . . . . . . . . . . . . . . 35
- SETNS - Set if Not Signed (386+) . . . . . . . . . . . . . . . . . 36
- SETC - Set if Carry (386+) . . . . . . . . . . . . . . . . . . . . 36
- SETNC - Set if Not Carry (386+). . . . . . . . . . . . . . . . . . 36
- SETO - Set if Overflow (386+). . . . . . . . . . . . . . . . . . . 36
- SETNO - Set if Not Overflow (386+) . . . . . . . . . . . . . . . . 36
- SETP/SETPE - Set if Parity / Set if Parity Even (386+). . . . . . 37
- SETNP/SETPO - Set if No Parity / Set if Parity Odd (386+). . . . . 37
- SGDT - Store Global Descriptor Table (286+ privileged) . . . . . . 37
- SIDT - Store Interrupt Descriptor Table (286+ privileged). . . . . 37
- SHL - Shift Logical Left . . . . . . . . . . . . . . . . . . . . . 37
- SHR - Shift Logical Right. . . . . . . . . . . . . . . . . . . . . 38
- SHLD/SHRD - Double Precision Shift (386+). . . . . . . . . . . . . 38
- SLDT - Store Local Descriptor Table (286+ privileged). . . . . . . 38
- SMSW - Store Machine Status Word (286+ privileged) . . . . . . . . 38
- STC - Set Carry. . . . . . . . . . . . . . . . . . . . . . . . . . 39
- STD - Set Direction Flag . . . . . . . . . . . . . . . . . . . . . 39
- STI - Set Interrupt Flag (Enable Interrupts). . . . . . . . . . . 39
- STOS - Store String (Byte, Word or Doubleword). . . . . . . . . . 39
- STR - Store Task Register (286+ privileged). . . . . . . . . . . . 39
- SUB - Subtract . . . . . . . . . . . . . . . . . . . . . . . . . . 40
- TEST - Test For Bit Pattern. . . . . . . . . . . . . . . . . . . . 40
- VERR - Verify Read (286+ protected). . . . . . . . . . . . . . . . 40
- VERW - Verify Write (286+ protected) . . . . . . . . . . . . . . . 40
- WAIT/FWAIT - Event Wait. . . . . . . . . . . . . . . . . . . . . . 41
- WBINVD - Write-Back and Invalidate Cache (486+). . . . . . . . . . 41
- XCHG - Exchange. . . . . . . . . . . . . . . . . . . . . . . . . . 41
- XLAT/XLATB - Translate . . . . . . . . . . . . . . . . . . . . . . 41
- XOR - Exclusive OR . . . . . . . . . . . . . . . . . . . . . . . . 42
- Intel 8086 Family Architecture
- General Purpose Registers Segment Registers
- AH/AL AX (EAX) Accumulator CS Code Segment
- BH/BL BX (EBX) Base DS Data Segment
- CH/CL CX (ECX) Counter SS Stack Segment
- DH/DL DX (EDX) Data ES Extra Segment
- (FS) 386 and newer
- (Exx) indicates 386+ 32 bit register (GS) 386 and newer
- Pointer Registers Stack Registers
- SI (ESI) Source Index SP (ESP) Stack Pointer
- DI (EDI) Destination Index BP (EBP) Base Pointer
- IP Instruction Pointer
- Status Registers
- FLAGS Status Flags (see FLAGS)
- Special Registers (386+ only)
- CR0 Control Register 0 DR0 Debug Register 0
- CR2 Control Register 2 DR1 Debug Register 1
- CR3 Control Register 3 DR2 Debug Register 2
- DR3 Debug Register 3
- TR4 Test Register 4 DR6 Debug Register 6
- TR5 Test Register 5 DR7 Debug Register 7
- TR6 Test Register 6
- TR7 Test Register 7
- Register Default Segment Valid Overrides
- BP SS DS, ES, CS
- SI or DI DS ES, SS, CS
- DI strings ES None
- SI strings DS ES, SS, CS
- - see CPU DETECTING Instruction Timing
- Instruction Clock Cycle Calculation
- Some instructions require additional clock cycles due to a "Next
- Instruction Component" identified by a "+m" in the instruction
- clock cycle listings. This is due to the prefetch queue being
- purge on a control transfers. Below is the general rule for
- calculating "m":
- 88/86 not applicable
- 286 "m" is the number of bytes in the next instruction
- 386 "m" is the number of components in the next instruction
- (the instruction coding (each byte), plus the data and
- the displacement are all considered components)
- 8088/8086 Effective Address (EA) Calculation
- Description Clock Cycles
- Displacement 6
- Base or Index (BX,BP,SI,DI) 5
- Displacement+(Base or Index) 9
- Base+Index (BP+DI,BX+SI) 7
- Base+Index (BP+SI,BX+DI) 8
- Base+Index+Displacement (BP+DI,BX+SI) 11
- Base+Index+Displacement (BP+SI+disp,BX+DI+disp) 12
- - add 4 cycles for word operands at odd addresses
- - add 2 cycles for segment override
- - 80188/80186 timings differ from those of the 8088/8086/80286
- Task State Calculation
- "TS" is defined as switching from VM/486 or 80286 TSS to one of
- the following:
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³ New Task ³
- ÃÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄ´
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´486 TSS³486 TSS³386 TSS³386 TSS³286 TSS³
- ³ Old Task ³ (VM=0)³ (VM=1)³ (VM=0)³ (VM=1)³ ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´
- 386 TSS (VM=0) ³ ³ ³ 309 ³ 226 ³ 282 ³
- ÃÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´
- 386 TSS (VM=1) ³ ³ ³ 314 ³ 231 ³ 287 ³
- ÃÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´
- 386 CPU/286 TSS ³ ³ ³ 307 ³ 224 ³ 280 ³
- ÃÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ´
- 486 CPU/286 TSS ³ 199 ³ 177 ³ ³ ³ 180 ³
- ÀÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÙ
- Miscellaneous
- - all timings are for best case and do not take into account wait
- states, instruction alignment, the state of the prefetch queue,
- DMA refresh cycles, cache hits/misses or exception processing.
- - to convert clocks to nanoseconds divide one microsecond by the
- processor speed in MegaHertz:
- (1000MHz/(n MHz)) = X nanoseconds
- - see 8086 Architecture
- FLAGS - Intel 8086 Family Flags Register
- ³11³10³F³E³D³C³B³A³9³8³7³6³5³4³3³2³1³0³
- ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ CF Carry Flag
- ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ 1
- ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ PF Parity Flag
- ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ 0
- ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ AF Auxiliary Flag
- ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ 0
- ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ ZF Zero Flag
- ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ SF Sign Flag
- ³ ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ TF Trap Flag (Single Step)
- ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ IF Interrupt Flag
- ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄ DF Direction Flag
- ³ ³ ³ ³ ³ ³ ÀÄÄÄ OF Overflow flag
- ³ ³ ³ ³ ÀÄÁÄÄÄ IOPL I/O Privilege Level (286+ only)
- ³ ³ ³ ÀÄÄÄÄÄ NT Nested Task Flag (286+ only)
- ³ ³ ÀÄÄÄÄÄ 0
- ³ ÀÄÄÄÄÄ RF Resume Flag (386+ only)
- ÀÄÄÄÄÄÄ VM Virtual Mode Flag (386+ only)
- - see PUSHF POPF STI CLI STD CLD
- MSW - Machine Status Word (286+ only)
- ³31³30-5³4³3³2³1³0³ Machine Status Word
- ³ ³ ³ ³ ³ ³ ÀÄÄÄÄ Protection Enable (PE)
- ³ ³ ³ ³ ³ ÀÄÄÄÄÄ Math Present (MP)
- ³ ³ ³ ³ ÀÄÄÄÄÄÄ Emulation (EM)
- ³ ³ ³ ÀÄÄÄÄÄÄÄ Task Switched (TS)
- ³ ³ ÀÄÄÄÄÄÄÄÄ Extension Type (ET)
- ³ ÀÄÄÄÄÄÄÄÄÄÄ Reserved
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄ Paging (PG)
- Bit 0 PE Protection Enable, switches processor between
- protected and real mode
- Bit 1 MP Math Present, controls function of the WAIT
- instruction
- Bit 2 EM Emulation, indicates whether coprocessor functions
- are to be emulated
- Bit 3 TS Task Switched, set and interrogated by coprocessor
- on task switches and when interpretting coprocessor
- instructions
- Bit 4 ET Extension Type, indicates type of coprocessor in
- system
- Bits 5-30 Reserved
- bit 31 PG Paging, indicates whether the processor uses page
- tables to translate linear addresses to physical
- addresses
- - see SMSW LMSW
- 8086/80186/80286/80386/80486 Instruction Set
- AAA - Ascii Adjust for Addition
- Usage: AAA
- Modifies flags: AF CF (OF,PF,SF,ZF undefined)
- Changes contents of AL to valid unpacked decimal. The high order
- nibble is zeroed.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 8 3 4 3 1
- AAD - Ascii Adjust for Division
- Usage: AAD
- Modifies flags: SF ZF PF (AF,CF,OF undefined)
- Used before dividing unpacked decimal numbers. Multiplies AH by
- 10 and the adds result into AL. Sets AH to zero. This instruction
- is also known to have an undocumented behavior.
- AL := 10*AH+AL
- AH := 0
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 60 14 19 14 2
- AAM - Ascii Adjust for Multiplication
- Usage: AAM
- Modifies flags: PF SF ZF (AF,CF,OF undefined)
- AH := AL / 10
- AL := AL mod 10
- Used after multiplication of two unpacked decimal numbers, this
- instruction adjusts an unpacked decimal number. The high order
- nibble of each byte must be zeroed before using this instruction.
- This instruction is also known to have an undocumented behavior.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 83 16 17 15 2
- AAS - Ascii Adjust for Subtraction
- Usage: AAS
- Modifies flags: AF CF (OF,PF,SF,ZF undefined)
- Corrects result of a previous unpacked decimal subtraction in AL.
- High order nibble is zeroed.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 8 3 4 3 1
- ADC - Add With Carry
- Usage: ADC dest,src
- Modifies flags: AF CF OF SF PF ZF
- Sums two binary operands placing the result in the destination.
- If CF is set, a 1 is added to the destination.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 3 2 2 1 2
- mem,reg 16+EA 7 7 3 2-4 (W88=24+EA)
- reg,mem 9+EA 7 6 2 2-4 (W88=13+EA)
- reg,immed 4 3 2 1 3-4
- mem,immed 17+EA 7 7 3 3-6 (W88=23+EA)
- accum,immed 4 3 2 1 2-3
- ADD - Arithmetic Addition
- Usage: ADD dest,src
- Modifies flags: AF CF OF PF SF ZF
- Adds "src" to "dest" and replacing the original contents of "dest".
- Both operands are binary.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 3 2 2 1 2
- mem,reg 16+EA 7 7 3 2-4 (W88=24+EA)
- reg,mem 9+EA 7 6 2 2-4 (W88=13+EA)
- reg,immed 4 3 2 1 3-4
- mem,immed 17+EA 7 7 3 3-6 (W88=23+EA)
- accum,immed 4 3 2 1 2-3
- AND - Logical And
- Usage: AND dest,src
- Modifies flags: CF OF PF SF ZF (AF undefined)
- Performs a logical AND of the two operands replacing the destination
- with the result.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 3 2 2 1 2
- mem,reg 16+EA 7 7 3 2-4 (W88=24+EA)
- reg,mem 9+EA 7 6 1 2-4 (W88=13+EA)
- reg,immed 4 3 2 1 3-4
- mem,immed 17+EA 7 7 3 3-6 (W88=23+EA)
- accum,immed 4 3 2 1 2-3
- ARPL - Adjusted Requested Privilege Level of Selector (286+ PM)
- Usage: ARPL dest,src
- (286+ protected mode)
- Modifies flags: ZF
- Compares the RPL bits of "dest" against "src". If the RPL bits
- of "dest" are less than "src", the destination RPL bits are set
- equal to the source RPL bits and the Zero Flag is set. Otherwise
- the Zero Flag is cleared.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg - 10 20 9 2
- mem,reg - 11 21 9 4
- BOUND - Array Index Bound Check (80188+)
- Usage: BOUND src,limit
- Modifies flags: None
- Array index in source register is checked against upper and lower
- bounds in memory source. The first word located at "limit" is
- the lower boundary and the word at "limit+2" is the upper array bound.
- Interrupt 5 occurs if the source value is less than or higher than
- the source.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16,mem32 - nj=13 nj=10 7 2
- reg32,mem64 - nj=13 nj=10 7 2
- - nj = no jump taken
- BSF - Bit Scan Forward (386+)
- Usage: BSF dest,src
- Modifies flags: ZF
- Scans source operand for first bit set. Sets ZF if a bit is found
- set and loads the destination with an index to first set bit. Clears
- ZF is no bits are found set. BSF scans forward across bit pattern
- (0-n) while BSR scans in reverse (n-0).
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg - - 10+3n 6-42 3
- reg,mem - - 10+3n 7-43 3-7
- reg32,reg32 - - 10+3n 6-42 3-7
- reg32,mem32 - - 10+3n 7-43 3-7
- BSR - Bit Scan Reverse (386+)
- Usage: BSR dest,src
- Modifies flags: ZF
- Scans source operand for first bit set. Sets ZF if a bit is found
- set and loads the destination with an index to first set bit. Clears
- ZF is no bits are found set. BSF scans forward across bit pattern
- (0-n) while BSR scans in reverse (n-0).
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg - - 10+3n 6-103 3
- reg,mem - - 10+3n 7-104 3-7
- reg32,reg32 - - 10+3n 6-103 3-7
- reg32,mem32 - - 10+3n 7-104 3-7
- BSWAP - Byte Swap (486+)
- Usage: BSWAP reg32
- Modifies flags: none
- Changes the byte order of a 32 bit register from big endian to
- little endian or vice versa. Result left in destination register
- is undefined if the operand is a 16 bit register.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg32 - - - 1 2
- BT - Bit Test (386+)
- Usage: BT dest,src
- Modifies flags: CF
- The destination bit indexed by the source value is copied into the
- Carry Flag.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16,immed8 - - 3 3 4-8
- mem16,immed8 - - 6 6 4-8
- reg16,reg16 - - 3 3 3-7
- mem16,reg16 - - 12 12 3-7
- BTC - Bit Test with Compliment (386+)
- Usage: BTC dest,src
- Modifies flags: CF
- The destination bit indexed by the source value is copied into the
- Carry Flag after being complimented (inverted).
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16,immed8 - - 6 6 4-8
- mem16,immed8 - - 8 8 4-8
- reg16,reg16 - - 6 6 3-7
- mem16,reg16 - - 13 13 3-7
- BTR - Bit Test with Reset (386+)
- Usage: BTR dest,src
- Modifies flags: CF
- The destination bit indexed by the source value is copied into the
- Carry Flag and then cleared in the destination.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16,immed8 - - 6 6 4-8
- mem16,immed8 - - 8 8 4-8
- reg16,reg16 - - 6 6 3-7
- mem16,reg16 - - 13 13 3-7
- BTS - Bit Test and Set (386+)
- Usage: BTS dest,src
- Modifies flags: CF
- The destination bit indexed by the source value is copied into the
- Carry Flag and then set in the destination.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16,immed8 - - 6 6 4-8
- mem16,immed8 - - 8 8 4-8
- reg16,reg16 - - 6 6 3-7
- mem16,reg16 - - 13 13 3-7
- CALL - Procedure Call
- Usage: CALL destination
- Modifies flags: None
- Pushes Instruction Pointer (and Code Segment for far calls) onto
- stack and loads Instruction Pointer with the address of proc-name.
- Code continues with execution at CS:IP.
- Clocks
- Operands 808x 286 386 486
- rel16 (near, IP relative) 19 7 7+m 3
- rel32 (near, IP relative) - - 7+m 3
- reg16 (near, register indirect) 16 7 7+m 5
- reg32 (near, register indirect) - - 7+m 5
- mem16 (near, memory indirect) - 21+EA 11 10+m 5
- mem32 (near, memory indirect) - - 10+m 5
- ptr16:16 (far, full ptr supplied) 28 13 17+m 18
- ptr16:32 (far, full ptr supplied) - - 17+m 18
- ptr16:16 (far, ptr supplied, prot. mode) - 26 34+m 20
- ptr16:32 (far, ptr supplied, prot. mode) - - 34+m 20
- m16:16 (far, indirect) 37+EA 16 22+m 17
- m16:32 (far, indirect) - - 22+m 17
- m16:16 (far, indirect, prot. mode) - 29 38+m 20
- m16:32 (far, indirect, prot. mode) - - 38+m 20
- ptr16:16 (task, via TSS or task gate) - 177 TS 37+TS
- m16:16 (task, via TSS or task gate) - 180/185 5+TS 37+TS
- m16:32 (task) - - TS 37+TS
- m16:32 (task) - - 5+TS 37+TS
- ptr16:16 (gate, same privilege) - 41 52+m 35
- ptr16:32 (gate, same privilege) - - 52+m 35
- m16:16 (gate, same privilege) - 44 56+m 35
- m16:32 (gate, same privilege) - - 56+m 35
- ptr16:16 (gate, more priv, no parm) - 82 86+m 69
- ptr16:32 (gate, more priv, no parm) - - 86+m 69
- m16:16 (gate, more priv, no parm) - 83 90+m 69
- m16:32 (gate, more priv, no parm) - - 90+m 69
- ptr16:16 (gate, more priv, x parms) - 86+4x 94+4x+m 77+4x
- ptr16:32 (gate, more priv, x parms) - - 94+4x+m 77+4x
- m16:16 (gate, more priv, x parms) - 90+4x 98+4x+m 77+4x
- m16:32 (gate, more priv, x parms) - - 98+4x+m 77+4x
- CBW - Convert Byte to Word
- Usage: CBW
- Modifies flags: None
- Converts byte in AL to word Value in AX by extending sign of AL
- throughout register AH.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 3 3 1
- CDQ - Convert Double to Quad (386+)
- Usage: CDQ
- Modifies flags: None
- Converts signed DWORD in EAX to a signed quad word in EDX:EAX by
- extending the high order bit of EAX throughout EDX
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none - - 2 3 1
- CLC - Clear Carry
- Usage: CLC
- Modifies flags: CF
- Clears the Carry Flag.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 2 2 1
- CLD - Clear Direction Flag
- Usage: CLD
- Modifies flags: DF
- Clears the Direction Flag causing string instructions to increment
- the SI and DI index registers.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 2 2 1
- CLI - Clear Interrupt Flag (disable)
- Usage: CLI
- Modifies flags: IF
- Disables the maskable hardware interrupts by clearing the Interrupt
- flag. NMI's and software interrupts are not inhibited.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 3 5 1
- CLTS - Clear Task Switched Flag (286+ privileged)
- Usage: CLTS
- Modifies flags: None
- Clears the Task Switched Flag in the Machine Status Register. This
- is a privileged operation and is generally used only by operating
- system code.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none - 2 5 7 2
- CMC - Complement Carry Flag
- Usage: CMC
- Modifies flags: CF
- Toggles (inverts) the Carry Flag
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 2 2 1
- CMP - Compare
- Usage: CMP dest,src
- Modifies flags: AF CF OF PF SF ZF
- Subtracts source from destination and updates the flags but does
- not save result. Flags can subsequently be checked for conditions.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 3 2 2 1 2
- mem,reg 9+EA 7 5 2 2-4 (W88=13+EA)
- reg,mem 9+EA 6 6 2 2-4 (W88=13+EA)
- reg,immed 4 3 2 1 3-4
- mem,immed 10+EA 6 5 2 3-6 (W88=14+EA)
- accum,immed 4 3 2 1 2-3
- CMPS - Compare String (Byte, Word or Doubleword)
- Usage: CMPS dest,src
- CMPSB
- CMPSW
- CMPSD (386+)
- Modifies flags: AF CF OF PF SF ZF
- Subtracts destination value from source without saving results.
- Updates flags based on the subtraction and the index registers
- (E)SI and (E)DI are incremented or decremented depending on the
- state of the Direction Flag. CMPSB inc/decrements the index
- registers by 1, CMPSW inc/decrements by 2, while CMPSD increments
- or decrements by 4. The REP prefixes can be used to process
- entire data items.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- dest,src 22 8 10 8 1 (W88=30)
- CMPXCHG - Compare and Exchange
- Usage: CMPXCHG dest,src (486+)
- Modifies flags: AF CF OF PF SF ZF
- Compares the accumulator (8-32 bits) with "dest". If equal the
- "dest" is loaded with "src", otherwise the accumulator is loaded
- with "dest".
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg - - - 6 2
- mem,reg - - - 7 2
- - add 3 clocks if the "mem,reg" comparison fails
- CWD - Convert Word to Doubleword
- Usage: CWD
- Modifies flags: None
- Extends sign of word in register AX throughout register DX forming
- a doubleword quantity in DX:AX.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 5 2 2 3 1
- CWDE - Convert Word to Extended Doubleword (386+)
- Usage: CWDE
- Modifies flags: None
- Converts a signed word in AX to a signed doubleword in EAX by
- extending the sign bit of AX throughout EAX.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none - - 3 3 1
- DAA - Decimal Adjust for Addition
- Usage: DAA
- Modifies flags: AF CF PF SF ZF (OF undefined)
- Corrects result (in AL) of a previous BCD addition operation.
- Contents of AL are changed to a pair of packed decimal digits.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 4 3 4 2 1
- DAS - Decimal Adjust for Subtraction
- Usage: DAS
- Modifies flags: AF CF PF SF ZF (OF undefined)
- Corrects result (in AL) of a previous BCD subtraction operation.
- Contents of AL are changed to a pair of packed decimal digits.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 4 3 4 2 1
- DEC - Decrement
- Usage: DEC dest
- Modifies flags: AF OF PF SF ZF
- Unsigned binary subtraction of one from the destination.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 3 2 2 1 2
- mem 15+EA 7 6 3 2-4
- reg16/32 3 2 2 1 1
- DIV - Divide
- Usage: DIV src
- Modifies flags: (AF,CF,OF,PF,SF,ZF undefined)
- Unsigned binary division of accumulator by source. If the source
- divisor is a byte value then AX is divided by "src" and the quotient
- is placed in AL and the remainder in AH. If source operand is a word
- value, then DX:AX is divided by "src" and the quotient is stored in AX
- and the remainder in DX.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 80-90 14 14 16 2
- reg16 144-162 22 22 24 2
- reg32 - - 38 40 2
- mem8 (86-96)+EA 17 17 16 2-4
- mem16 (150-168)+EA 25 25 24 2-4 (W88=158-176+EA)
- mem32 - - 41 40 2-4
- ENTER - Make Stack Frame (80188+)
- Usage: ENTER locals,level
- Modifies flags: None
- Modifies stack for entry to procedure for high level language.
- Operand "locals" specifies the amount of storage to be allocated
- on the stack. "Level" specifies the nesting level of the routine.
- Paired with the LEAVE instruction, this is an efficient method of
- entry and exit to procedures.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- immed16,0 - 11 10 14 4
- immed16,1 - 15 12 17 4
- immed16,immed8 - 12+4(n-1) 15+4(n-1) 17+3n 4
- ESC - Escape
- Usage: ESC immed,src
- Modifies flags: None
- Provides access to the data bus for other resident processors.
- The CPU treats it as a NOP but places memory operand on bus.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- immed,reg 2 9-20 ? 2
- immed,mem 2 9-20 ? 2-4
- HLT - Halt CPU
- Usage: HLT
- Modifies flags: None
- Halts CPU until RESET line is activated, NMI or maskable interrupt
- received. The CPU becomes dormant but retains the current CS:IP
- for later restart.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 5 4 1
- IDIV - Signed Integer Division
- Usage: IDIV src
- Modifies flags: (AF,CF,OF,PF,SF,ZF undefined)
- Signed binary division of accumulator by source. If source is a
- byte value, AX is divided by "src" and the quotient is stored in
- AL and the remainder in AH. If source is a word value, DX:AX is
- divided by "src", and the quotient is stored in AL and the
- remainder in DX.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 101-112 17 19 19 2
- reg16 165-184 25 27 27 2
- reg32 - - 43 43 2
- mem8 (107-118)+EA 20 22 20 2-4
- mem16 (171-190)+EA 38 30 28 2-4 (W88=175-194)
- mem32 - - 46 44 2-4
- IMUL - Signed Multiply
- Usage: IMUL src
- IMUL src,immed (286+)
- IMUL dest,src,immed8 (286+)
- IMUL dest,src (386+)
- Modifies flags: CF OF (AF,PF,SF,ZF undefined)
- Signed multiplication of accumulator by "src" with result placed
- in the accumulator. If the source operand is a byte value, it
- is multiplied by AL and the result stored in AX. If the source
- operand is a word value it is multiplied by AX and the result is
- stored in DX:AX. Other variations of this instruction allow
- specification of source and destination registers as well as a
- third immediate factor.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 80-98 13 9-14 13-18 2
- reg16 128-154 21 9-22 13-26 2
- reg32 - - 9-38 12-42 2
- mem8 86-104 16 12-17 13-18 2-4
- mem16 134-160 24 12-25 13-26 2-4
- mem32 - - 12-41 13-42 2-4
- reg16,reg16 - - 9-22 13-26 3-5
- reg32,reg32 - - 9-38 13-42 3-5
- reg16,mem16 - - 12-25 13-26 3-5
- reg32,mem32 - - 12-41 13-42 3-5
- reg16,immed - 21 9-22 13-26 3
- reg32,immed - 21 9-38 13-42 3-6
- reg16,reg16,immed - 2 9-22 13-26 3-6
- reg32,reg32,immed - 21 9-38 13-42 3-6
- reg16,mem16,immed - 24 12-25 13-26 3-6
- reg32,mem32,immed - 24 12-41 13-42 3-6
- IN - Input Byte or Word From Port
- Usage: IN accum,port
- Modifies flags: None
- A byte, word or dword is read from "port" and placed in AL, AX or
- EAX respectively. If the port number is in the range of 0-255
- it can be specified as an immediate, otherwise the port number
- must be specified in DX. Valid port ranges on the PC are 0-1024,
- though values through 65535 may be specified and recognized by
- third party vendors and PS/2's.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- accum,immed8 10/14 5 12 14 2
- accum,immed8 (PM) 6/26 8/28/27 2
- accum,DX 8/12 5 13 14 1
- accum,DX (PM) 7/27 8/28/27 1
- - 386+ protected mode timings depend on privilege levels.
- first number is the timing if: CPL ó IOPL
- second number is the timing if: CPL > IOPL or in VM 86 mode (386)
- CPL ò IOPL (486)
- third number is the timing when: virtual mode on 486 processor
- - 486 virtual mode always requires 27 cycles
- INC - Increment
- Usage: INC dest
- Modifies flags: AF OF PF SF ZF
- Adds one to destination unsigned binary operand.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 3 2 2 1 2
- reg16 3 2 2 1 1
- reg32 3 2 2 1 1
- mem 15+EA 7 6 3 2-4 (W88=23+EA)
- INS - Input String from Port (80188+)
- Usage: INS dest,port
- INSB
- INSW
- INSD (386+)
- Modifies flags: None
- Loads data from port to the destination ES:(E)DI (even if a
- destination operand is supplied). (E)DI is adjusted by the size
- of the operand and increased if the Direction Flag is cleared and
- decreased if the Direction Flag is set. For INSB, INSW, INSD no
- operands are allowed and the size is determined by the mnemonic.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- dest,port - 5 15 17 1
- dest,port (PM) - 5 9/29 10/32/30 1
- none - 5 15 17 1
- none (PM) - 5 9/29 10/32/30 1
- - 386+ protected mode timings depend on privilege levels.
- first number is the timing if: CPL ó IOPL
- second number is the timing if: CPL > IOPL
- third number is the timing if: virtual mode on 486 processor
- INT - Interrupt
- Usage: INT num
- Modifies flags: TF IF
- Initiates a software interrupt by pushing the flags, clearing the
- Trap and Interrupt Flags, pushing CS followed by IP and loading
- CS:IP with the value found in the interrupt vector table. Execution
- then begins at the location addressed by the new CS:IP
- Clocks Size
- Operands 808x 286 386 486 Bytes
- 3 (constant) 52/72 23+m 33 26 2
- 3 (prot. mode, same priv.) - 40+m 59 44 2
- 3 (prot. mode, more priv.) - 78+m 99 71 2
- 3 (from VM86 to PL 0) - - 119 82 2
- 3 (prot. mode via task gate) - 167+m TS 37+TS 2
- immed8 51/71 23+m 37 30 1
- immed8 (prot. mode, same priv.) - 40+m 59 44 1
- immed8 (prot. mode, more priv.) - 78+m 99 71 1
- immed8 (from VM86 to PL 0) - - 119 86 1
- immed8 (prot. mode, via task gate) - 167+m TS 37+TS 1
- INTO - Interrupt on Overflow
- Usage: INTO
- Modifies flags: IF TF
- If the Overflow Flag is set this instruction generates an INT 4
- which causes the code addressed by 0000:0010 to be executed.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none: jump 53/73 24+m 35 28 1
- no jump 4 3 3 3
- (prot. mode, same priv.) - - 59 46 1
- (prot. mode, more priv.) - - 99 73 1
- (from VM86 to PL 0) - - 119 84 1
- (prot. mode, via task gate) - TS 39+TS 1
- INVD - Invalidate Cache (486+)
- Usage: INVD
- Modifies flags: none
- Flushes CPU internal cache. Issues special function bus cycle
- which indicates to flush external caches. Data in write-back
- external caches is lost.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none - - - 4 2
- INVLPG - Invalidate Translation Look-Aside Buffer Entry (486+)
- Usage: INVLPG
- Modifies flags: none
- Invalidates a single page table entry in the Translation
- Look-Aside Buffer. Intel warns that this instruction may be
- implemented differently on future processors.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none - - - 12 2
- - timing is for TLB entry hit only.
- IRET/IRETD - Interrupt Return
- Usage: IRET
- IRETD (386+)
- Modifies flags: AF CF DF IF PF SF TF ZF
- Returns control to point of interruption by popping IP, CS
- and then the Flags from the stack and continues execution at
- this location. CPU exception interrupts will return to the
- instruction that cause the exception because the CS:IP placed
- on the stack during the interrupt is the address of the offending
- instruction.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- iret 32/44 17+m 22 15 1
- iret (prot. mode) - 31+m 38 15 1
- iret (to less privilege) - 55+m 82 36 1
- iret (different task, NT=1) - 169+m TS TS+32 1
- iretd - - 22/38 15 1
- iretd (to less privilege) - - 82 36 1
- iretd (to VM86 mode) - - 60 15 1
- iretd (different task, NT=1) - - TS TS+32 1
- - 386 timings are listed as real-mode/protected-mode
- Jxx - Jump Instructions Table
- Mnemonic Meaning Jump Condition
- JA Jump if Above CF=0 and ZF=0
- JAE Jump if Above or Equal CF=0
- JB Jump if Below CF=1
- JBE Jump if Below or Equal CF=1 or ZF=1
- JC Jump if Carry CF=1
- JCXZ Jump if CX Zero CX=0
- JE Jump if Equal ZF=1
- JG Jump if Greater (signed) ZF=0 and SF=OF
- JGE Jump if Greater or Equal (signed) SF=OF
- JL Jump if Less (signed) SF != OF
- JLE Jump if Less or Equal (signed) ZF=1 or SF != OF
- JMP Unconditional Jump unconditional
- JNA Jump if Not Above CF=1 or ZF=1
- JNAE Jump if Not Above or Equal CF=1
- JNB Jump if Not Below CF=0
- JNBE Jump if Not Below or Equal CF=0 and ZF=0
- JNC Jump if Not Carry CF=0
- JNE Jump if Not Equal ZF=0
- JNG Jump if Not Greater (signed) ZF=1 or SF != OF
- JNGE Jump if Not Greater or Equal (signed) SF != OF
- JNL Jump if Not Less (signed) SF=OF
- JNLE Jump if Not Less or Equal (signed) ZF=0 and SF=OF
- JNO Jump if Not Overflow (signed) OF=0
- JNP Jump if No Parity PF=0
- JNS Jump if Not Signed (signed) SF=0
- JNZ Jump if Not Zero ZF=0
- JO Jump if Overflow (signed) OF=1
- JP Jump if Parity PF=1
- JPE Jump if Parity Even PF=1
- JPO Jump if Parity Odd PF=0
- JS Jump if Signed (signed) SF=1
- JZ Jump if Zero ZF=1
- Clocks Size
- Operands 808x 286 386 486 Bytes
- Jx: jump 16 7+m 7+m 3 2
- no jump 4 3 3 1
- Jx near-label - - 7+m 3 4
- no jump - - 3 1
- - It's a good programming practice to organize code so the
- expected case is executed without a jump since the actual
- jump takes longer to execute than falling through the test.
- - see JCXZ and JMP for their respective timings
- JCXZ/JECXZ - Jump if Register (E)CX is Zero
- Usage: JCXZ label
- JECXZ label (386+)
- Modifies flags: None
- Causes execution to branch to "label" if register CX is zero. Uses
- unsigned comparision.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- label: jump 18 8+m 9+m 8 2
- no jump 6 4 5 5
- JMP - Unconditional Jump
- Usage: JMP target
- Modifies flags: None
- Unconditionally transfers control to "label". Jumps by default
- are within -32768 to 32767 bytes from the instruction following
- the jump. NEAR and SHORT jumps cause the IP to be updated while FAR
- jumps cause CS and IP to be updated.
- Clocks
- Operands 808x 286 386 486
- rel8 (relative) 15 7+m 7+m 3
- rel16 (relative) 15 7+m 7+m 3
- rel32 (relative) - - 7+m 3
- reg16 (near, register indirect) 11 7+m 7+m 5
- reg32 (near, register indirect) - - 7+m 5
- mem16 (near, mem indirect) 18+EA 11+m 10+m 5
- mem32 (near, mem indirect) 24+EA 15+m 10+m 5
- ptr16:16 (far, dword immed) - - 12+m 17
- ptr16:16 (far, PM dword immed) - - 27+m 19
- ptr16:16 (call gate, same priv.) - 38+m 45+m 32
- ptr16:16 (via TSS) - 175+m TS 42+TS
- ptr16:16 (via task gate) - 180+m TS 43+TS
- mem16:16 (far, indirect) - - 43+m 13
- mem16:16 (far, PM indirect) - - 31+m 18
- mem16:16 (call gate, same priv.) - 41+m 49+m 31
- mem16:16 (via TSS) - 178+m 5+TS 41+TS
- mem16:16 (via task gate) - 183+m 5+TS 42+TS
- ptr16:32 (far, 6 byte immed) - - 12+m 13
- ptr16:32 (far, PM 6 byte immed) - - 27+m 18
- ptr16:32 (call gate, same priv.) - - 45+m 31
- ptr16:32 (via TSS) - - TS 42+TS
- ptr16:32 (via task state) - - TS 43+TS
- m16:32 (far, address at dword) - - 43+m 13
- m16:32 (far, address at dword) - - 31+m 18
- m16:32 (call gate, same priv.) - - 49+m 31
- m16:32 (via TSS) - - 5+TS 41+TS
- m16:32 (via task state) - - 5+TS 42+TS
- LAHF - Load Register AH From Flags
- Usage: LAHF
- Modifies flags: None
- Copies bits 0-7 of the flags register into AH. This includes flags
- AF, CF, PF, SF and ZF other bits are undefined.
- AH := SF ZF xx AF xx PF xx CF
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 4 2 2 3 1
- LAR - Load Access Rights (286+ protected)
- Usage: LAR dest,src
- Modifies flags: ZF
- The high byte of the of the destination register is overwritten by
- the value of the access rights byte and the low order byte is zeroed
- depending on the selection in the source operand. The Zero Flag is
- set if the load operation is successful.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16,reg16 - 14 15 11 3
- reg32,reg32 - - 15 11 3
- reg16,mem16 - 16 16 11 3-7
- reg32,mem32 - - 16 11 3-7
- LDS - Load Pointer Using DS
- Usage: LDS dest,src
- Modifies flags: None
- Loads 32-bit pointer from memory source to destination register
- and DS. The offset is placed in the destination register and the
- segment is placed in DS. To use this instruction the word at the
- lower memory address must contain the offset and the word at the
- higher address must contain the segment. This simplifies the loading
- of far pointers from the stack and the interrupt vector table.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16,mem32 16+EA 7 7 6 2-4
- reg,mem (PM) - - 22 12 5-7
- LEA - Load Effective Address
- Usage: LEA dest,src
- Modifies flags: None
- Transfers offset address of "src" to the destination register.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,mem 2+EA 3 2 1 2-4
- - the MOV instruction can often save clock cycles when used in
- place of LEA on 8088 processors
- LEAVE - Restore Stack for Procedure Exit (80188+)
- Usage: LEAVE
- Modifies flags: None
- Releases the local variables created by the previous ENTER
- instruction by restoring SP and BP to their condition before
- the procedure stack frame was initialized.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none - 5 4 5 1
- LES - Load Pointer Using ES
- Usage: LES dest,src
- Modifies flags: None
- Loads 32-bit pointer from memory source to destination register
- and ES. The offset is placed in the destination register and the
- segment is placed in ES. To use this instruction the word at the
- lower memory address must contain the offset and the word at the
- higher address must contain the segment. This simplifies the loading
- of far pointers from the stack and the interrupt vector table.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,mem 16+EA 7 7 6 2-4 (W88=24+EA)
- reg,mem (PM) - - 22 12 5-7
- LFS - Load Pointer Using FS (386+)
- Usage: LFS dest,src
- Modifies flags: None
- Loads 32-bit pointer from memory source to destination register
- and FS. The offset is placed in the destination register and the
- segment is placed in FS. To use this instruction the word at the
- lower memory address must contain the offset and the word at the
- higher address must contain the segment. This simplifies the loading
- of far pointers from the stack and the interrupt vector table.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,mem - - 7 6 5-7
- reg,mem (PM) - - 22 12 5-7
- LGDT - Load Global Descriptor Table (286+ privileged)
- Usage: LGDT src
- Modifies flags: None
- Loads a value from an operand into the Global Descriptor Table
- (GDT) register.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- mem64 - 11 11 11 5
- LIDT - Load Interrupt Descriptor Table (286+ privileged)
- Usage: LIDT src
- Modifies flags: None
- Loads a value from an operand into the Interrupt Descriptor Table
- (IDT) register.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- mem64 - 12 11 11 5
- LGS - Load Pointer Using GS (386+)
- Usage: LGS dest,src
- Modifies flags: None
- Loads 32-bit pointer from memory source to destination register
- and GS. The offset is placed in the destination register and the
- segment is placed in GS. To use this instruction the word at the
- lower memory address must contain the offset and the word at the
- higher address must contain the segment. This simplifies the loading
- of far pointers from the stack and the interrupt vector table.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,mem - - 7 6 5-7
- reg,mem (PM) - - 22 12 5-7
- LLDT - Load Local Descriptor Table (286+ privileged)
- Usage: LLDT src
- Modifies flags: None
- Loads a value from an operand into the Local Descriptor Table
- Register (LDTR).
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16 - 17 20 11 3
- mem16 - 19 24 11 5
- LMSW - Load Machine Status Word (286+ privileged)
- Usage: LMSW src
- Modifies flags: None
- Loads the Machine Status Word (MSW) from data found at "src"
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16 - 3 10 13 3
- mem16 - 6 13 13 5
- LOCK - Lock Bus
- Usage: LOCK
- LOCK: (386+ prefix)
- Modifies flags: None
- This instruction is a prefix that causes the CPU assert bus lock
- signal during the execution of the next instruction. Used to
- avoid two processors from updating the same data location. The
- 286 always asserts lock during an XCHG with memory operands. This
- should only be used to lock the bus prior to XCHG, MOV, IN and
- OUT instructions.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 0 0 1 1
- LODS - Load String (Byte, Word or Double)
- Usage: LODS src
- LODSB
- LODSW
- LODSD (386+)
- Modifies flags: None
- Transfers string element addressed by DS:SI (even if an operand is
- supplied) to the accumulator. SI is incremented based on the size
- of the operand or based on the instruction used. If the Direction
- Flag is set SI is decremented, if the Direction Flag is clear SI
- is incremented. Use with REP prefixes.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- src 12/16 5 5 5 1
- LOOP - Decrement CX and Loop if CX Not Zero
- Usage: LOOP label
- Modifies flags: None
- Decrements CX by 1 and transfers control to "label" if CX is not
- Zero. The "label" operand must be within -128 or 127 bytes of the
- instruction following the loop instruction
- Clocks Size
- Operands 808x 286 386 486 Bytes
- label: jump 18 8+m 11+m 6 2
- no jump 5 4 ? 2
- LOOPE/LOOPZ - Loop While Equal / Loop While Zero
- Usage: LOOPE label
- LOOPZ label
- Modifies flags: None
- Decrements CX by 1 (without modifying the flags) and transfers
- control to "label" if CX != 0 and the Zero Flag is set. The
- "label" operand must be within -128 or 127 bytes of the instruction
- following the loop instruction.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- label: jump 18 8+m 11+m 9 2
- no jump 5 4 ? 6
- LOOPNZ/LOOPNE - Loop While Not Zero / Loop While Not Equal
- Usage: LOOPNZ label
- LOOPNE label
- Modifies flags: None
- Decrements CX by 1 (without modifying the flags) and transfers
- control to "label" if CX != 0 and the Zero Flag is clear. The
- "label" operand must be within -128 or 127 bytes of the instruction
- following the loop instruction.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- label: jump 19 8+m 11+m 9 2
- no jump 5 4 ? 6
- LSL - Load Segment Limit (286+ protected)
- Usage: LSL dest,src
- Modifies flags: ZF
- Loads the segment limit of a selector into the destination register
- if the selector is valid and visible at the current privilege level.
- If loading is successful the Zero Flag is set, otherwise it is
- cleared.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16,reg16 - 14 20/25 10 3
- reg32,reg32 - - 20/25 10 3
- reg16,mem16 - 16 21/26 10 5
- reg32,mem32 - - 21/26 10 5
- - 386 times are listed "byte granular" / "page granular"
- LSS - Load Pointer Using SS (386+)
- Usage: LSS dest,src
- Modifies flags: None
- Loads 32-bit pointer from memory source to destination register
- and SS. The offset is placed in the destination register and the
- segment is placed in SS. To use this instruction the word at the
- lower memory address must contain the offset and the word at the
- higher address must contain the segment. This simplifies the loading
- of far pointers from the stack and the interrupt vector table.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,mem - - 7 6 5-7
- reg,mem (PM) - - 22 12 5-7
- LTR - Load Task Register (286+ privileged)
- Usage: LTR src
- Modifies flags: None
- Loads the current task register with the value specified in "src".
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16 - 17 23 20 3
- mem16 - 19 27 20 5
- MOV - Move Byte or Word
- Usage: MOV dest,src
- Modifies flags: None
- Copies byte or word from the source operand to the destination
- operand. If the destination is SS interrupts are disabled except
- on early buggy 808x CPUs. Some CPUs disable interrupts if the
- destination is any of the segment registers
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 2 2 2 1 2
- mem,reg 9+EA 3 2 1 2-4 (W88=13+EA)
- reg,mem 8+EA 5 4 1 2-4 (W88=12+EA)
- mem,immed 10+EA 3 2 1 3-6 (W88=14+EA)
- reg,immed 4 2 2 1 2-3
- mem,accum 10 3 2 1 3 (W88=14)
- accum,mem 10 5 4 1 3 (W88=14)
- segreg,reg16 2 2 2 3 2
- segreg,mem16 8+EA 5 5 9 2-4 (W88=12+EA)
- reg16,segreg 2 2 2 3 2
- mem16,segreg 9+EA 3 2 3 2-4 (W88=13+EA)
- reg32,CR0/CR2/CR3 - - 6 4
- CR0,reg32 - - 10 16
- CR2,reg32 - - 4 4 3
- CR3,reg32 - - 5 4 3
- reg32,DR0/DR1/DR2/DR3 - 22 10 3
- reg32,DR6/DR7 - - 22 10 3
- DR0/DR1/DR2/DR3,reg32 - 22 11 3
- DR6/DR7,reg32 - - 16 11 3
- reg32,TR6/TR7 - - 12 4 3
- TR6/TR7,reg32 - - 12 4 3
- reg32,TR3 3
- TR3,reg32 6
- - when the 386 special registers are used all operands are 32 bits
- MOVS - Move String (Byte or Word)
- Usage: MOVS dest,src
- MOVSB
- MOVSW
- MOVSD (386+)
- Modifies flags: None
- Copies data from addressed by DS:SI (even if operands are given) to
- the location ES:DI destination and updates SI and DI based on the
- size of the operand or instruction used. SI and DI are incremented
- when the Direction Flag is cleared and decremented when the Direction
- Flag is Set. Use with REP prefixes.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- dest,src 18 5 7 7 1 (W88=26)
- MOVSX - Move with Sign Extend (386+)
- Usage: MOVSX dest,src
- Modifies flags: None
- Copies the value of the source operand to the destination register
- with the sign extended.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg - - 3 3 3
- reg,mem - - 6 3 3-7
- MOVZX - Move with Zero Extend (386+)
- Usage: MOVZX dest,src
- Modifies flags: None
- Copies the value of the source operand to the destination register
- with the zeroes extended.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg - - 3 3 3
- reg,mem - - 6 3 3-7
- MUL - Unsigned Multiply
- Usage: MUL src
- Modifies flags: CF OF (AF,PF,SF,ZF undefined)
- Unsigned multiply of the accumulator by the source. If "src" is
- a byte value, then AL is used as the other multiplicand and the
- result is placed in AX. If "src" is a word value, then AX is
- multiplied by "src" and DX:AX receives the result. If "src" is
- a double word value, then EAX is multiplied by "src" and EDX:EAX
- receives the result. The 386+ uses an early out algorithm which
- makes multiplying any size value in EAX as fast as in the 8 or 16
- bit registers.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 70-77 13 9-14 13-18 2
- reg16 118-113 21 9-22 13-26 2
- reg32 - - 9-38 13-42 2-4
- mem8 (76-83)+EA 16 12-17 13-18 2-4
- mem16 (124-139)+EA 24 12-25 13-26 2-4
- mem32 - - 12-21 13-42 2-4
- NEG - Two's Complement Negation
- Usage: NEG dest
- Modifies flags: AF CF OF PF SF ZF
- Subtracts the destination from 0 and saves the 2s complement of
- "dest" back into "dest".
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg 3 2 2 1 2
- mem 16+EA 7 6 3 2-4 (W88=24+EA)
- NOP - No Operation (90h)
- Usage: NOP
- Modifies flags: None
- This is a do nothing instruction. It results in occupation of both
- space and time and is most useful for patching code segments.
- (This is the original XCHG AL,AL instruction)
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 3 3 3 1 1
- NOT - One's Compliment Negation (Logical NOT)
- Usage: NOT dest
- Modifies flags: None
- Inverts the bits of the "dest" operand forming the 1s complement.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg 3 2 2 1 2
- mem 16+EA 7 6 3 2-4 (W88=24+EA)
- OR - Inclusive Logical OR
- Usage: OR dest,src
- Modifies flags: CF OF PF SF ZF (AF undefined)
- Logical inclusive OR of the two operands returning the result in
- the destination. Any bit set in either operand will be set in the
- destination.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 3 2 2 1 2
- mem,reg 16+EA 7 7 3 2-4 (W88=24+EA)
- reg,mem 9+EA 7 6 2 2-4 (W88=13+EA)
- reg,immed 4 3 2 1 3-4
- mem8,immed8 17+EA 7 7 3 3-6
- mem16,immed16 25+EA 7 7 3 3-6
- accum,immed 4 3 2 1 2-3
- OUT - Output Data to Port
- Usage: OUT port,accum
- Modifies flags: None
- Transfers byte in AL,word in AX or dword in EAX to the specified
- hardware port address. If the port number is in the range of 0-255
- it can be specified as an immediate. If greater than 255 then the
- port number must be specified in DX. Since the PC only decodes 10
- bits of the port address, values over 1023 can only be decoded by
- third party vendor equipment and also map to the port range 0-1023.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- immed8,accum 10/14 3 10 16 2
- immed8,accum (PM) - - 4/24 11/31/29 2
- DX,accum 8/12 3 11 16 1
- DX,accum (PM) - - 5/25 10/30/29 1
- - 386+ protected mode timings depend on privilege levels.
- first number is the timing when: CPL ó IOPL
- second number is the timing when: CPL > IOPL
- third number is the timing when: virtual mode on 486 processor
- OUTS - Output String to Port (80188+)
- Usage: OUTS port,src
- OUTSB
- OUTSW
- OUTSD (386+)
- Modifies flags: None
- Transfers a byte, word or doubleword from "src" to the hardware
- port specified in DX. For instructions with no operands the "src"
- is located at DS:SI and SI is incremented or decremented by the
- size of the operand or the size dictated by the instruction format.
- When the Direction Flag is set SI is decremented, when clear, SI is
- incremented. If the port number is in the range of 0-255 it can
- be specified as an immediate. If greater than 255 then the port
- number must be specified in DX. Since the PC only decodes 10 bits
- of the port address, values over 1023 can only be decoded by third
- party vendor equipment and also map to the port range 0-1023.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- port,src - 5 14 17 1
- port,src (PM) - - 8/28 10/32/30 1
- - 386+ protected mode timings depend on privilege levels.
- first number is the timing when: CPL ó IOPL
- second number is the timing when: CPL > IOPL
- third number is the timing when: virtual mode on 486 processor
- POP - Pop Word off Stack
- Usage: POP dest
- Modifies flags: None
- Transfers word at the current stack top (SS:SP) to the destination
- then increments SP by two to point to the new stack top. CS is not
- a valid destination.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16 8 5 4 4 1
- reg32 4 - - 4 1
- segreg 8 5 7 3 1
- mem16 17+EA 5 5 6 2-4
- mem32 5 - - 6 2-4
- POPA/POPAD - Pop All Registers onto Stack (80188+)
- Usage: POPA
- POPAD (386+)
- Modifies flags: None
- Pops the top 8 words off the stack into the 8 general purpose 16/32
- bit registers. Registers are popped in the following order: (E)DI,
- (E)SI, (E)BP, (E)SP, (E)DX, (E)CX and (E)AX. The (E)SP value popped
- from the stack is actually discarded.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none - 19 24 9 1
- POPF/POPFD - Pop Flags off Stack
- Usage: POPF
- POPFD (386+)
- Modifies flags: all flags
- Pops word/doubleword from stack into the Flags Register and then
- increments SP by 2 (for POPF) or 4 (for POPFD).
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 8/12 5 5 9 1 (W88=12)
- none (PM) - - 5 6 1
- PUSH - Push Word onto Stack
- Usage: PUSH src
- PUSH immed (80188+ only)
- Modifies flags: None
- Decrements SP by the size of the operand (two or four, byte values
- are sign extended) and transfers one word from source to the stack
- top (SS:SP).
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16 11/15 3 2 1 1
- reg32 - - 2 1 1
- mem16 16+EA 5 5 4 2-4 (W88=24+EA)
- mem32 - - 5 4 2-4
- segreg 10/14 3 2 3 1
- immed - 3 2 1 2-3
- PUSHA/PUSHAD - Push All Registers onto Stack (80188+)
- Usage: PUSHA
- PUSHAD (386+)
- Modifies flags: None
- Pushes all general purpose registers onto the stack in the following
- order: (E)AX, (E)CX, (E)DX, (E)BX, (E)SP, (E)BP, (E)SI, (E)DI. The
- value of SP is the value before the actual push of SP.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none - 19 24 11 1
- PUSHF/PUSHFD - Push Flags onto Stack
- Usage: PUSHF
- PUSHFD (386+)
- Modifies flags: None
- Transfers the Flags Register onto the stack. PUSHF saves a 16 bit
- value while PUSHFD saves a 32 bit value.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 10/14 3 4 4 1
- none (PM) - - 4 3 1
- RCL - Rotate Through Carry Left
- Usage: RCL dest,count
- Modifies flags: CF OF
- ÚÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ÚÄþ³C³<þÄÄþ³7 <ÄÄÄÄÄÄÄÄÄÄ 0³<Ä¿
- ³ ÀÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- Rotates the bits in the destination to the left "count" times with
- all data pushed out the left side re-entering on the right. The
- Carry Flag holds the last bit rotated out.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,1 2 2 9 3 2
- mem,1 15+EA 7 10 4 2-4 (W88=23+EA)
- reg,CL 8+4n 5+n 9 8-30 2
- mem,CL 20+EA+4n 8+n 10 9-31 2-4 (W88=28+EA+4n)
- reg,immed8 - 5+n 9 8-30 3
- mem,immed8 - 8+n 10 9-31 3-5
- RCR - Rotate Through Carry Right
- Usage: RCR dest,count
- Modifies flags: CF OF
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄ¿
- ÚÄ>³7 þÄÄÄÄÄÄÄÄÄ> 0³þÄÄÄ>³C³þÄ¿
- ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÙ ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- Rotates the bits in the destination to the right "count" times with
- all data pushed out the right side re-entering on the left. The
- Carry Flag holds the last bit rotated out.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,1 2 2 9 3 2
- mem,1 15+EA 7 10 4 2-4 (W88=23+EA)
- reg,CL 8+4n 5+n 9 8-30 2
- mem,CL 20+EA+4n 8+n 10 9-31 2-4 (W88=28+EA+4n)
- reg,immed8 - 5+n 9 8-30 3
- mem,immed8 - 8+n 10 9-31 3-5
- REP - Repeat String Operation
- Usage: REP
- Modifies flags: None
- Repeats execution of string instructions while CX != 0. After
- each string operation, CX is decremented and the Zero Flag is
- tested. The combination of a repeat prefix and a segment override
- on CPU's before the 386 may result in errors if an interrupt occurs
- before CX=0. The following code shows code that is susceptible to
- this and how to avoid it:
- again: rep movs byte ptr ES:[DI],ES:[SI] ; vulnerable instr.
- jcxz next ; continue if REP successful
- loop again ; interrupt goofed count
- next:
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 2 1
- REPE/REPZ - Repeat Equal / Repeat Zero
- Usage: REPE
- REPZ
- Modifies flags: None
- Repeats execution of string instructions while CX != 0 and the Zero
- Flag is set. CX is decremented and the Zero Flag tested after
- each string operation. The combination of a repeat prefix and a
- segment override on processors other than the 386 may result in
- errors if an interrupt occurs before CX=0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 2 1
- REPNE/REPNZ - Repeat Not Equal / Repeat Not Zero
- Usage: REPNE
- REPNZ
- Modifies flags: None
- Repeats execution of string instructions while CX != 0 and the Zero
- Flag is clear. CX is decremented and the Zero Flag tested after
- each string operation. The combination of a repeat prefix and a
- segment override on processors other than the 386 may result in
- errors if an interrupt occurs before CX=0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 2 1
- RET/RETF - Return From Procedure
- Usage: RET nBytes
- RETF nBytes
- RETN nBytes
- Modifies flags: None
- Transfers control from a procedure back to the instruction address
- saved on the stack. "n bytes" is an optional number of bytes to
- release. Far returns pop the IP followed by the CS, while near
- returns pop only the IP register.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- retn 16/20 11+m 10+m 5 1
- retn immed 20/24 11+m 10+m 5 3
- retf 26/34 15+m 18+m 13 1
- retf (PM, same priv.) - 32+m 18 1
- retf (PM, lesser priv.) - 68 33 1
- retf immed 25/33 15+m 18+m 14 3
- retf immed (PM, same priv.) 32+m 17 1
- retf immed (PM, lesser priv.) 68 33 1
- ROL - Rotate Left
- Usage: ROL dest,count
- Modifies flags: CF OF
- ÚÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³C³<þÂÄþ³7 <ÄÄÄÄÄÄÄÄÄÄ 0³<Ä¿
- ÀÄÙ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- Rotates the bits in the destination to the left "count" times with
- all data pushed out the left side re-entering on the right. The
- Carry Flag will contain the value of the last bit rotated out.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,1 2 2 3 3 2
- mem,1 15+EA 7 7 4 2-4 (W88=23+EA)
- reg,CL 8+4n 5+n 3 3 2
- mem,CL 20+EA+4n 8+n 7 4 2-4 (W88=28+EA+4n)
- reg,immed8 - 5+n 3 2 3
- mem,immed8 - 8+n 7 4 3-5
- ROR - Rotate Right
- Usage: ROR dest,count
- Modifies flags: CF OF
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄ¿
- ÚÄ>³7 þÄÄÄÄÄÄÄÄÄ> 0³þÄÂÄ>³C³
- ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ÀÄÙ
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- Rotates the bits in the destination to the right "count" times with
- all data pushed out the right side re-entering on the left. The
- Carry Flag will contain the value of the last bit rotated out.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,1 2 2 3 3 2
- mem,1 15+EA 7 7 4 2-4 (W88=23+EA)
- reg,CL 8+4n 5+n 3 3 2
- mem,CL 20+EA+4n 8+n 7 4 2-4 (W88=28+EA+4n)
- reg,immed8 - 5+n 3 2 3
- mem,immed8 - 8+n 7 4 3-5
- SAHF - Store AH Register into FLAGS
- Usage: SAHF
- Modifies flags: AF CF PF SF ZF
- Transfers bits 0-7 of AH into the Flags Register. This includes
- AF, CF, PF, SF and ZF.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 4 2 3 2 1
- SAL/SHL - Shift Arithmetic Left / Shift Logical Left
- Usage: SAL dest,count
- SHL dest,count
- Modifies flags: CF OF PF SF ZF (AF undefined)
- ÚÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄ¿
- ³C³<ÄÄÄþ³7 <ÄÄÄÄÄÄÄÄÄÄ 0³<ÄÄÄþ³0³
- ÀÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÙ
- Shifts the destination left by "count" bits with zeroes shifted
- in on right. The Carry Flag contains the last bit shifted out.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,1 2 2 3 3 2
- mem,1 15+EA 7 7 4 2-4 (W88=23+EA)
- reg,CL 8+4n 5+n 3 3 2
- mem,CL 20+EA+4n 8+n 7 4 2-4 (W88=28+EA+4n)
- reg,immed8 - 5+n 3 2 3
- mem,immed8 - 8+n 7 4 3-5
- SAR - Shift Arithmetic Right
- Usage: SAR dest,count
- Modifies flags: CF OF PF SF ZF (AF undefined)
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄ¿
- ÚÄþ³7 ÄÄÄÄÄÄÄÄÄÄ> 0³ÄÄÄþ>³C³
- ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÙ
- ÀÄÄÄ^
- Shifts the destination right by "count" bits with the current sign
- bit replicated in the leftmost bit. The Carry Flag contains the
- last bit shifted out.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,1 2 2 3 3 2
- mem,1 15+EA 7 7 4 2-4 (W88=23+EA)
- reg,CL 8+4n 5+n 3 3 2
- mem,CL 20+EA+4n 8+n 7 4 2-4 (W88=28+EA+4n)
- reg,immed8 - 5+n 3 2 3
- mem,immed8 - 8+n 7 4 3-5
- SBB - Subtract with Borrow/Carry
- Usage: SBB dest,src
- Modifies flags: AF CF OF PF SF ZF
- Subtracts the source from the destination, and subtracts 1 extra if
- the Carry Flag is set. Results are returned in "dest".
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 3 2 2 1 2
- mem,reg 16+EA 7 6 3 2-4 (W88=24+EA)
- reg,mem 9+EA 7 7 2 2-4 (W88=13+EA)
- reg,immed 4 3 2 1 3-4
- mem,immed 17+EA 7 7 3 3-6 (W88=25+EA)
- accum,immed 4 3 2 1 2-3
- SCAS - Scan String (Byte, Word or Doubleword)
- Usage: SCAS string
- SCASB
- SCASW
- SCASD (386+)
- Modifies flags: AF CF OF PF SF ZF
- Compares value at ES:DI (even if operand is specified) from the
- accumulator and sets the flags similar to a subtraction. DI is
- incremented/decremented based on the instruction format (or
- operand size) and the state of the Direction Flag. Use with REP
- prefixes.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- string 15 7 7 6 1 (W88=19)
- SETAE/SETNB - Set if Above or Equal / Set if Not Below (386+)
- Usage: SETAE dest
- SETNB dest
- (unsigned, 386+)
- Modifies flags: none
- Sets the byte in the operand to 1 if the Carry Flag is clear
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETB/SETNAE - Set if Below / Set if Not Above or Equal (386+)
- Usage: SETB dest
- SETNAE dest
- (unsigned, 386+)
- Modifies flags: none
- Sets the byte in the operand to 1 if the Carry Flag is set
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETBE/SETNA - Set if Below or Equal / Set if Not Above (386+)
- Usage: SETBE dest
- SETNA dest
- (unsigned, 386+)
- Modifies flags: none
- Sets the byte in the operand to 1 if the Carry Flag or the Zero
- Flag is set, otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETE/SETZ - Set if Equal / Set if Zero (386+)
- Usage: SETE dest
- SETZ dest
- Modifies flags: none
- Sets the byte in the operand to 1 if the Zero Flag is set,
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETNE/SETNZ - Set if Not Equal / Set if Not Zero (386+)
- Usage: SETNE dest
- SETNZ dest
- Modifies flags: none
- Sets the byte in the operand to 1 if the Zero Flag is clear,
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETL/SETNGE - Set if Less / Set if Not Greater or Equal (386+)
- Usage: SETL dest
- SETNGE dest
- (signed, 386+)
- Modifies flags: none
- Sets the byte in the operand to 1 if the Sign Flag is not equal
- to the Overflow Flag, otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETGE/SETNL - Set if Greater or Equal / Set if Not Less (386+)
- Usage: SETGE dest
- SETNL dest
- (signed, 386+)
- Modifies flags: none
- Sets the byte in the operand to 1 if the Sign Flag equals the
- Overflow Flag, otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETLE/SETNG - Set if Less or Equal / Set if Not greater or Equal (386+)
- Usage: SETLE dest
- SETNG dest
- (signed, 386+)
- Modifies flags: none
- Sets the byte in the operand to 1 if the Zero Flag is set or the
- Sign Flag is not equal to the Overflow Flag, otherwise sets the
- operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETG/SETNLE - Set if Greater / Set if Not Less or Equal (386+)
- Usage: SETG dest
- SETNLE dest
- (signed, 386+)
- Modifies flags: none
- Sets the byte in the operand to 1 if the Zero Flag is clear or the
- Sign Flag equals to the Overflow Flag, otherwise sets the operand
- to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETS - Set if Signed (386+)
- Usage: SETS dest
- Modifies flags: none
- Sets the byte in the operand to 1 if the Sign Flag is set, otherwise
- sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETNS - Set if Not Signed (386+)
- Usage: SETNS dest
- Modifies flags: none
- Sets the byte in the operand to 1 if the Sign Flag is clear,
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETC - Set if Carry (386+)
- Usage: SETC dest
- Modifies flags: none
- Sets the byte in the operand to 1 if the Carry Flag is set,
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETNC - Set if Not Carry (386+)
- Usage: SETNC dest
- Modifies flags: none
- Sets the byte in the operand to 1 if the Carry Flag is clear,
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETO - Set if Overflow (386+)
- Usage: SETO dest
- Modifies flags: none
- Sets the byte in the operand to 1 if the Overflow Flag is set,
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETNO - Set if Not Overflow (386+)
- Usage: SETNO dest
- Modifies flags: none
- Sets the byte in the operand to 1 if the Overflow Flag is clear,
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETP/SETPE - Set if Parity / Set if Parity Even (386+)
- Usage: SETP dest
- SETPE dest
- Modifies flags: none
- Sets the byte in the operand to 1 if the Parity Flag is set,
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SETNP/SETPO - Set if No Parity / Set if Parity Odd (386+)
- Usage: SETNP dest
- SETPO dest
- Modifies flags: none
- Sets the byte in the operand to 1 if the Parity Flag is clear,
- otherwise sets the operand to 0.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg8 - - 4 3 3
- mem8 - - 5 4 3
- SGDT - Store Global Descriptor Table (286+ privileged)
- Usage: SGDT dest
- Modifies flags: none
- Stores the Global Descriptor Table (GDT) Register into the
- specified operand.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- mem64 - 11 9 10 5
- SIDT - Store Interrupt Descriptor Table (286+ privileged)
- Usage: SIDT dest
- Modifies flags: none
- Stores the Interrupt Descriptor Table (IDT) Register into the
- specified operand.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- mem64 - 12 9 10 5
- SHL - Shift Logical Left
- See: SAL
- SHR - Shift Logical Right
- Usage: SHR dest,count
- Modifies flags: CF OF PF SF ZF (AF undefined)
- ÚÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄ¿
- ³0³ÄÄÄþ>³7 ÄÄÄÄÄÄÄÄÄÄ> 0³ÄÄÄþ>³C³
- ÀÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÙ
- Shifts the destination right by "count" bits with zeroes shifted
- in on the left. The Carry Flag contains the last bit shifted out.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,1 2 2 3 2
- mem,1 15+EA 7 7 2-4 (W88=23+EA)
- reg,CL 8+4n 5+n 3 2
- mem,CL 20+EA+4n 8+n 7 2-4 (W88=28+EA+4n)
- reg,immed8 - 5+n 3 3
- mem,immed8 - 8+n 7 3-5
- SHLD/SHRD - Double Precision Shift (386+)
- Usage: SHLD dest,src,count
- SHRD dest,src,count
- Modifies flags: CF PF SF ZF (OF,AF undefined)
- SHLD shifts "dest" to the left "count" times and the bit positions
- opened are filled with the most significant bits of "src". SHRD
- shifts "dest" to the right "count" times and the bit positions
- opened are filled with the least significant bits of the second
- operand. Only the 5 lower bits of "count" are used.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16,reg16,immed8 - - 3 2 4
- reg32,reg32,immed8 - - 3 2 4
- mem16,reg16,immed8 - - 7 3 6
- mem32,reg32,immed8 - - 7 3 6
- reg16,reg16,CL - - 3 3 3
- reg32,reg32,CL - - 3 3 3
- mem16,reg16,CL - - 7 4 5
- mem32,reg32,CL - - 7 4 5
- SLDT - Store Local Descriptor Table (286+ privileged)
- Usage: SLDT dest
- Modifies flags: none
- Stores the Local Descriptor Table (LDT) Register into the
- specified operand.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16 - 2 2 2 3
- mem16 - 2 2 3 5
- SMSW - Store Machine Status Word (286+ privileged)
- Usage: SMSW dest
- Modifies flags: none
- Store Machine Status Word (MSW) into "dest".
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16 - 2 10 2 3
- mem16 - 3 3 3 5
- STC - Set Carry
- Usage: STC
- Modifies flags: CF
- Sets the Carry Flag to 1.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 2 2 1
- STD - Set Direction Flag
- Usage: STD
- Modifies flags: DF
- Sets the Direction Flag to 1 causing string instructions to
- auto-decrement SI and DI instead of auto-increment.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 2 2 1
- STI - Set Interrupt Flag (Enable Interrupts)
- Usage: STI
- Modifies flags: IF
- Sets the Interrupt Flag to 1, which enables recognition of all
- hardware interrupts. If an interrupt is generated by a hardware
- device, an End of Interrupt (EOI) must also be issued to enable
- other hardware interrupts of the same or lower priority.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 2 2 2 5 1
- STOS - Store String (Byte, Word or Doubleword)
- Usage: STOS dest
- STOSB
- STOSW
- STOSD
- Modifies flags: None
- Stores value in accumulator to location at ES:(E)DI (even if operand
- is given). (E)DI is incremented/decremented based on the size of
- the operand (or instruction format) and the state of the Direction
- Flag. Use with REP prefixes.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- dest 11 3 4 5 1 (W88=15)
- STR - Store Task Register (286+ privileged)
- Usage: STR dest
- Modifies flags: None
- Stores the current Task Register to the specified operand.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16 - 2 2 2 3
- mem16 - 3 2 3 5
- SUB - Subtract
- Usage: SUB dest,src
- Modifies flags: AF CF OF PF SF ZF
- The source is subtracted from the destination and the result is
- stored in the destination.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 3 2 2 1 2
- mem,reg 16+EA 7 6 3 2-4 (W88=24+EA)
- reg,mem 9+EA 7 7 2 2-4 (W88=13+EA)
- reg,immed 4 3 2 1 3-4
- mem,immed 17+EA 7 7 3 3-6 (W88=25+EA)
- accum,immed 4 3 2 1 2-3
- TEST - Test For Bit Pattern
- Usage: TEST dest,src
- Modifies flags: CF OF PF SF ZF (AF undefined)
- Performs a logical AND of the two operands updating the flags
- register without saving the result.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 3 2 1 1 2
- reg,mem 9+EA 6 5 1 2-4 (W88=13+EA)
- mem,reg 9+EA 6 5 2 2-4 (W88=13+EA)
- reg,immed 5 3 2 1 3-4
- mem,immed 11+EA 6 5 2 3-6
- accum,immed 4 3 2 1 2-3
- VERR - Verify Read (286+ protected)
- Usage: VERR src
- Modifies flags: ZF
- Verifies the specified segment selector is valid and is readable
- at the current privilege level. If the segment is readable,
- the Zero Flag is set, otherwise it is cleared.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16 - 14 10 11 3
- mem16 - 16 11 11 5
- VERW - Verify Write (286+ protected)
- Usage: VERW src
- Modifies flags: ZF
- Verifies the specified segment selector is valid and is ratable
- at the current privilege level. If the segment is writable,
- the Zero Flag is set, otherwise it is cleared.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg16 - 14 15 11 3
- mem16 - 16 16 11 5
- WAIT/FWAIT - Event Wait
- Usage: WAIT
- FWAIT
- Modifies flags: None
- CPU enters wait state until the coprocessor signals it has finished
- its operation. This instruction is used to prevent the CPU from
- accessing memory that may be temporarily in use by the coprocessor.
- WAIT and FWAIT are identical.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none 4 3 6+ 1-3 1
- WBINVD - Write-Back and Invalidate Cache (486+)
- Usage: WBINVD
- Modifies flags: None
- Flushes internal cache, then signals the external cache to write
- back current data followed by a signal to flush the external cache.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- none - - - 5 2
- XCHG - Exchange
- Usage: XCHG dest,src
- Modifies flags: None
- Exchanges contents of source and destination.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 4 3 3 3 2
- mem,reg 17+EA 5 5 5 2-4 (W88=25+EA)
- reg,mem 17+EA 5 5 3 2-4 (W88=25+EA)
- accum,reg 3 3 3 3 1
- reg,accum 3 3 3 3 1
- XLAT/XLATB - Translate
- Usage: XLAT translation-table
- XLATB (masm 5.x)
- Modifies flags: None
- Replaces the byte in AL with byte from a user table addressed by
- BX. The original value of AL is the index into the translate table.
- The best way to discripe this is MOV AL,[BX+AL]
- Clocks Size
- Operands 808x 286 386 486 Bytes
- table offset 11 5 5 4 1
- XOR - Exclusive OR
- Usage: XOR dest,src
- Modifies flags: CF OF PF SF ZF (AF undefined)
- Performs a bitwise exclusive OR of the operands and returns
- the result in the destination.
- Clocks Size
- Operands 808x 286 386 486 Bytes
- reg,reg 3 2 2 1 2
- mem,reg 16+EA 7 6 3 2-4 (W88=24+EA)
- reg,mem 9+EA 7 7 2 2-4 (W88=13+EA)
- reg,immed 4 3 2 1 3-4
- mem,immed 17+EA 7 7 3 3-6 (W88=25+EA)
- accum,immed 4 3 2 1 2-3
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement