i386 instructions

Instruction reference: i386 · x64 · ARM32 (Thumb-2) · ARM64 (AArch64)

All 614 instructions in 1,184 forms that Asmonite assembles for .arch i386 and Dismonite decodes: name, operands, the encoding in bytes and a short description. The search box finds an instruction, a byte sequence (0F B6) or a word of the description. The AVX instructions (VEX, EVEX) are not included: Asmonite and Dismonite do not know them yet.

How to read the table

The operands are in the order of the source text: the destination first, then the source (Intel notation). r8 to r64 is a register of that width, m a memory address, r/m32 a register or 32 bits of memory, imm8 a number in the instruction, rel8 and rel32 a jump distance, xmm and mm vector registers.

Under the description is the operation in pseudo code: dst is the first operand (the destination), src the second (the source), [x] the memory at address x; sext and zext extend with sign and with zeros, >>s shifts with sign, hi:lo is a register pair. Below are the flags the instruction changes and those that are undefined afterwards.

The encoding is the bytes of the instruction, coloured by their role:

66 F3 F2prefix: chooses the 16-bit form (66) or, with SSE, the kind of instruction (66 = doubles, F3 = one single, F2 = one double)
0F 38 3Aopcode escape (two- and three-byte tables)
8B B8+rdthe opcode; +rb, +rw, +rd, +rq: the number of the register goes into the low three bits of the opcode
/r /0…/7a ModRM byte follows (with register, memory and address parts). /r: the reg field is a register; /0 to /7: the reg field is part of the opcode
ib iw id iq cb cdthen: a number of 1, 2, 4 or 8 bytes (i…) or a jump distance (c…); moffs is an absolute address

The table is for 32-bit mode (Windows and Linux, 32 bit); the 64-bit instructions are on the page x64 instructions. It is derived from the decoder of Dismonite and made again when the decoder changes; the descriptions are short, longer explanations are in the help (F1) of Asmonite and Dismonite.

InstructionOperandsEncodingDescription
aaa37ASCII adjust after an addition (BCD)if (al & 15) > 9 or AF = 1 then { al = al + 6; ah = ah + 1; AF = CF = 1 } else { AF = CF = 0 }; al = al & 15Flags: AF CF · undefined: OF SF ZF PFArithmetic
aadimm8D5 ibASCII adjust before a division (BCD)al = ah * imm8 + al; ah = 0 (imm8 is 10 for BCD)Flags: SF ZF PF · undefined: OF AF CFArithmetic
aamimm8D4 ibASCII adjust after a multiplication (BCD)ah = al / imm8; al = al % imm8 (imm8 is 10 for BCD)Flags: SF ZF PF · undefined: OF AF CFArithmetic
aas3FASCII adjust after a subtraction (BCD)if (al & 15) > 9 or AF = 1 then { al = al - 6; ah = ah - 1; AF = CF = 1 } else { AF = CF = 0 }; al = al & 15Flags: AF CF · undefined: OF SF ZF PFArithmetic
adcr/m8, r810 /rAddition with carry (CF)dst = dst + src + CFFlags: OF SF ZF AF CF PFArithmetic
r/m32, r3211 /r
r/m16, r1666 11 /r
r8, r/m812 /r
r32, r/m3213 /r
r16, r/m1666 13 /r
al, imm814 ib
eax, imm3215 id
ax, imm1666 15 iw
r/m8, imm880 /2 ib
r/m32, imm3281 /2 id
r/m16, imm1666 81 /2 iw
r/m8, imm882 /2 ib
r/m32, imm883 /2 ib
r/m16, imm866 83 /2 ib
adcxr32, r/m3266 0F 38 F6 /rAddition with carry, changes only CFdst = dst + src + CFFlags: CFArithmetic
addr/m8, r800 /rAddition of the source to the destinationdst = dst + srcFlags: OF SF ZF AF CF PFArithmetic
r/m32, r3201 /r
r/m16, r1666 01 /r
r8, r/m802 /r
r32, r/m3203 /r
r16, r/m1666 03 /r
al, imm804 ib
eax, imm3205 id
ax, imm1666 05 iw
r/m8, imm880 /0 ib
r/m32, imm3281 /0 id
r/m16, imm1666 81 /0 iw
r/m8, imm882 /0 ib
r/m32, imm883 /0 ib
r/m16, imm866 83 /0 ib
addpdxmm, xmm/m12866 0F 58 /rAddition of 2 doublesfor every element: dst[i] = dst[i] + src[i] (double)SSE floating point
addpsxmm, xmm/m1280F 58 /rAddition of 4 singlesfor every element: dst[i] = dst[i] + src[i] (single)SSE floating point
addsdxmm, xmm/m64F2 0F 58 /rAddition of one doubledst[0] = dst[0] + src[0] (double); the other elements staySSE floating point
addssxmm, xmm/m32F3 0F 58 /rAddition of one singledst[0] = dst[0] + src[0] (single); the other elements staySSE floating point
addsubpdxmm, xmm/m12866 0F D0 /rAlternating subtraction and addition (doubles)even elements: dst[i] = dst[i] - src[i]; odd elements: dst[i] = dst[i] + src[i]SSE floating point
addsubpsxmm, xmm/m128F2 0F D0 /rAlternating subtraction and addition (singles)even elements: dst[i] = dst[i] - src[i]; odd elements: dst[i] = dst[i] + src[i]SSE floating point
adoxr32, r/m32F3 0F 38 F6 /rAddition with the overflow flag, changes only OFdst = dst + src + OFFlags: OFArithmetic
aesdecxmm, xmm/m12866 0F 38 DE /rOne AES decryption rounddst = inverse AES round of dst with the round key srcCryptography
aesdeclastxmm, xmm/m12866 0F 38 DF /rThe last AES decryption rounddst = last inverse AES round of dst with the round key srcCryptography
aesencxmm, xmm/m12866 0F 38 DC /rOne AES encryption rounddst = AES round of dst with the round key srcCryptography
aesenclastxmm, xmm/m12866 0F 38 DD /rThe last AES encryption rounddst = last AES round of dst with the round key srcCryptography
aesimcxmm, xmm/m12866 0F 38 DB /rConversion of an AES round key for decryptiondst = InvMixColumns(src)Cryptography
aeskeygenassistxmm, xmm/m128, imm866 0F 3A DF /r ibHelper for AES key generationdst = helper values for the AES key schedule from src (round constant imm8)Cryptography
andr/m8, r820 /rBitwise ANDdst = dst & src; CF = OF = 0Flags: OF SF ZF CF PF · undefined: AFLogic and bits
r/m32, r3221 /r
r/m16, r1666 21 /r
r8, r/m822 /r
r32, r/m3223 /r
r16, r/m1666 23 /r
al, imm824 ib
eax, imm3225 id
ax, imm1666 25 iw
r/m8, imm880 /4 ib
r/m32, imm3281 /4 id
r/m16, imm1666 81 /4 iw
r/m8, imm882 /4 ib
r/m32, imm883 /4 ib
r/m16, imm866 83 /4 ib
andnpdxmm, xmm/m12866 0F 55 /rBitwise: NOT destination AND sourcedst = ~dst & srcSSE floating point
andnpsxmm, xmm/m1280F 55 /rBitwise: NOT destination AND sourcedst = ~dst & srcSSE floating point
andpdxmm, xmm/m12866 0F 54 /rBitwise ANDdst = dst & srcSSE floating point
andpsxmm, xmm/m1280F 54 /rBitwise ANDdst = dst & srcSSE floating point
arplr/m16, r1663 /rAdjustment of the requested privilege level (RPL) of a segment selectorif dst.RPL < src.RPL then { dst.RPL = src.RPL; ZF = 1 } else ZF = 0Flags: ZFSystem and privileged
blendpdxmm, xmm/m128, imm866 0F 3A 0D /r ibSelection of doubles from two registers by a maskfor every element: dst[i] = bit i of imm8 ? src[i] : dst[i]SSE floating point
blendpsxmm, xmm/m128, imm866 0F 3A 0C /r ibSelection of singles from two registers by a maskfor every element: dst[i] = bit i of imm8 ? src[i] : dst[i]SSE floating point
blendvpdxmm, xmm/m128, xmm066 0F 38 15 /rSelection of doubles by the sign bits of xmm0for every element: dst[i] = (sign bit of xmm0[i]) ? src[i] : dst[i]SSE floating point
blendvpsxmm, xmm/m128, xmm066 0F 38 14 /rSelection of singles by the sign bits of xmm0for every element: dst[i] = (sign bit of xmm0[i]) ? src[i] : dst[i]SSE floating point
boundr32, m62 /rCheck of an array index against bounds in memoryraise #BR if index dst < [m] or dst > [m + size]System and privileged
r16, m66 62 /r
bsfr32, r/m320F BC /rSearch for the lowest set bitdst = index of the lowest 1 bit of src; ZF = (src = 0), dst undefined thenFlags: ZFLogic and bits
r16, r/m1666 0F BC /r
bsrr32, r/m320F BD /rSearch for the highest set bitdst = index of the highest 1 bit of src; ZF = (src = 0), dst undefined thenFlags: ZFLogic and bits
r16, r/m1666 0F BD /r
bswapr320F C8+rdReversal of the byte order (little/big endian)dst = reverse_bytes(dst)Data transfer
btr/m32, r320F A3 /rCopy of one bit to CFCF = bit src of dstFlags: CFLogic and bits
r/m16, r1666 0F A3 /r
r/m32, imm80F BA /4 ib
r/m16, imm866 0F BA /4 ib
btcr/m32, imm80F BA /7 ibCopy of one bit to CF and inversion of the bitCF = bit src of dst; bit src of dst = not bitFlags: CFLogic and bits
r/m16, imm866 0F BA /7 ib
r/m32, r320F BB /r
r/m16, r1666 0F BB /r
btrr/m32, r320F B3 /rCopy of one bit to CF and clearing of the bitCF = bit src of dst; bit src of dst = 0Flags: CFLogic and bits
r/m16, r1666 0F B3 /r
r/m32, imm80F BA /6 ib
r/m16, imm866 0F BA /6 ib
btsr/m32, r320F AB /rCopy of one bit to CF and setting of the bitCF = bit src of dst; bit src of dst = 1Flags: CFLogic and bits
r/m16, r1666 0F AB /r
r/m32, imm80F BA /5 ib
r/m16, imm866 0F BA /5 ib
callrel32E8 cdCall of a function (the return address is pushed)push(eip of the next instruction); eip = targetJumps, calls and interrupts
rel1666 E8 cw
r/m32FF /2
mFF /3
r/m1666 FF /2
cbw66 98Sign extension of al into axax = sext(al)Data transfer
cdq99Sign extension of eax into edx:eaxedx:eax = sext(eax)Data transfer
clac0F 01 CAClearing of the AC flag (access protection)EFLAGS.AC = 0Flags: ACFlags
clcF8Clearing of the carry flagCF = 0Flags: CFFlags
cldFCClearing of the direction flag (string instructions count up)DF = 0Flags: DFFlags
clflushm0F AE /7Flush of a cache linewrite back and remove the cache line of [m] from all cachesSystem and privileged
clflushoptm66 0F AE /7Flush of a cache line (faster, loosely ordered)write back and remove the cache line of [m] from all cachesSystem and privileged
cliFADisabling of interrupts (IF=0)IF = 0Flags: IFFlags
clts0F 06Clearing of the task-switched flag in cr0CR0.TS = 0 (privileged)System and privileged
clwbm66 0F AE /6Write-back of a cache line without flushing itwrite back the cache line of [m], it may stay in the cacheSystem and privileged
cmcF5Inversion of the carry flagCF = not CFFlags: CFFlags
cmovar32, r/m320F 47 /rCopy only if unsigned above (CF=0 and ZF=0)if CF = 0 and ZF = 0 then dst = srcData transfer
r16, r/m1666 0F 47 /r
cmovber32, r/m320F 46 /rCopy only if unsigned below or equal (CF=1 or ZF=1)if CF = 1 or ZF = 1 then dst = srcData transfer
r16, r/m1666 0F 46 /r
cmovcr32, r/m320F 42 /rCopy only if carry, unsigned below (CF=1)if CF = 1 then dst = srcData transfer
r16, r/m1666 0F 42 /r
cmovgr32, r/m320F 4F /rCopy only if signed greater (ZF=0 and SF=OF)if ZF = 0 and SF = OF then dst = srcData transfer
r16, r/m1666 0F 4F /r
cmovger32, r/m320F 4D /rCopy only if signed greater or equal (SF=OF)if SF = OF then dst = srcData transfer
r16, r/m1666 0F 4D /r
cmovlr32, r/m320F 4C /rCopy only if signed less (SF≠OF)if SF != OF then dst = srcData transfer
r16, r/m1666 0F 4C /r
cmovler32, r/m320F 4E /rCopy only if signed less or equal (ZF=1 or SF≠OF)if ZF = 1 or SF != OF then dst = srcData transfer
r16, r/m1666 0F 4E /r
cmovncr32, r/m320F 43 /rCopy only if no carry, unsigned above or equal (CF=0)if CF = 0 then dst = srcData transfer
r16, r/m1666 0F 43 /r
cmovnor32, r/m320F 41 /rCopy only if no overflow (OF=0)if OF = 0 then dst = srcData transfer
r16, r/m1666 0F 41 /r
cmovnpr32, r/m320F 4B /rCopy only if parity odd (PF=0)if PF = 0 then dst = srcData transfer
r16, r/m1666 0F 4B /r
cmovnsr32, r/m320F 49 /rCopy only if not negative (SF=0)if SF = 0 then dst = srcData transfer
r16, r/m1666 0F 49 /r
cmovnzr32, r/m320F 45 /rCopy only if not equal, result not zero (ZF=0)if ZF = 0 then dst = srcData transfer
r16, r/m1666 0F 45 /r
cmovor32, r/m320F 40 /rCopy only if overflow (OF=1)if OF = 1 then dst = srcData transfer
r16, r/m1666 0F 40 /r
cmovpr32, r/m320F 4A /rCopy only if parity even (PF=1)if PF = 1 then dst = srcData transfer
r16, r/m1666 0F 4A /r
cmovsr32, r/m320F 48 /rCopy only if negative (SF=1)if SF = 1 then dst = srcData transfer
r16, r/m1666 0F 48 /r
cmovzr32, r/m320F 44 /rCopy only if equal, result zero (ZF=1)if ZF = 1 then dst = srcData transfer
r16, r/m1666 0F 44 /r
cmpr/m8, r838 /rComparison (destination minus source), only the flags changeflags = dst - src (the result is thrown away)Flags: OF SF ZF AF CF PFCompare and exchange
r/m32, r3239 /r
r/m16, r1666 39 /r
r8, r/m83A /r
r32, r/m323B /r
r16, r/m1666 3B /r
al, imm83C ib
eax, imm323D id
ax, imm1666 3D iw
r/m8, imm880 /7 ib
r/m32, imm3281 /7 id
r/m16, imm1666 81 /7 iw
r/m8, imm882 /7 ib
r/m32, imm883 /7 ib
r/m16, imm866 83 /7 ib
cmpeqpdxmm, xmm/m12866 0F C2 /r 00Comparison of 2 doubles for equal, the result is a maskfor every element: dst[i] = (dst[i] eq src[i]) ? all 1 bits : 0SSE floating point
cmpeqpsxmm, xmm/m1280F C2 /r 00Comparison of 4 singles for equal, the result is a maskfor every element: dst[i] = (dst[i] eq src[i]) ? all 1 bits : 0SSE floating point
cmpeqsdxmm, xmm/m64F2 0F C2 /r 00Comparison of one double for equal, the result is a maskfor every element: dst[i] = (dst[i] eq src[i]) ? all 1 bits : 0SSE floating point
cmpeqssxmm, xmm/m32F3 0F C2 /r 00Comparison of one single for equal, the result is a maskfor every element: dst[i] = (dst[i] eq src[i]) ? all 1 bits : 0SSE floating point
cmplepdxmm, xmm/m12866 0F C2 /r 02Comparison of 2 doubles for less or equal, the result is a maskfor every element: dst[i] = (dst[i] le src[i]) ? all 1 bits : 0SSE floating point
cmplepsxmm, xmm/m1280F C2 /r 02Comparison of 4 singles for less or equal, the result is a maskfor every element: dst[i] = (dst[i] le src[i]) ? all 1 bits : 0SSE floating point
cmplesdxmm, xmm/m64F2 0F C2 /r 02Comparison of one double for less or equal, the result is a maskfor every element: dst[i] = (dst[i] le src[i]) ? all 1 bits : 0SSE floating point
cmplessxmm, xmm/m32F3 0F C2 /r 02Comparison of one single for less or equal, the result is a maskfor every element: dst[i] = (dst[i] le src[i]) ? all 1 bits : 0SSE floating point
cmpltpdxmm, xmm/m12866 0F C2 /r 01Comparison of 2 doubles for less, the result is a maskfor every element: dst[i] = (dst[i] lt src[i]) ? all 1 bits : 0SSE floating point
cmpltpsxmm, xmm/m1280F C2 /r 01Comparison of 4 singles for less, the result is a maskfor every element: dst[i] = (dst[i] lt src[i]) ? all 1 bits : 0SSE floating point
cmpltsdxmm, xmm/m64F2 0F C2 /r 01Comparison of one double for less, the result is a maskfor every element: dst[i] = (dst[i] lt src[i]) ? all 1 bits : 0SSE floating point
cmpltssxmm, xmm/m32F3 0F C2 /r 01Comparison of one single for less, the result is a maskfor every element: dst[i] = (dst[i] lt src[i]) ? all 1 bits : 0SSE floating point
cmpneqpdxmm, xmm/m12866 0F C2 /r 04Comparison of 2 doubles for not equal, the result is a maskfor every element: dst[i] = (dst[i] neq src[i]) ? all 1 bits : 0SSE floating point
cmpneqpsxmm, xmm/m1280F C2 /r 04Comparison of 4 singles for not equal, the result is a maskfor every element: dst[i] = (dst[i] neq src[i]) ? all 1 bits : 0SSE floating point
cmpneqsdxmm, xmm/m64F2 0F C2 /r 04Comparison of one double for not equal, the result is a maskfor every element: dst[i] = (dst[i] neq src[i]) ? all 1 bits : 0SSE floating point
cmpneqssxmm, xmm/m32F3 0F C2 /r 04Comparison of one single for not equal, the result is a maskfor every element: dst[i] = (dst[i] neq src[i]) ? all 1 bits : 0SSE floating point
cmpnlepdxmm, xmm/m12866 0F C2 /r 06Comparison of 2 doubles for not less or equal, the result is a maskfor every element: dst[i] = (dst[i] nle src[i]) ? all 1 bits : 0SSE floating point
cmpnlepsxmm, xmm/m1280F C2 /r 06Comparison of 4 singles for not less or equal, the result is a maskfor every element: dst[i] = (dst[i] nle src[i]) ? all 1 bits : 0SSE floating point
cmpnlesdxmm, xmm/m64F2 0F C2 /r 06Comparison of one double for not less or equal, the result is a maskfor every element: dst[i] = (dst[i] nle src[i]) ? all 1 bits : 0SSE floating point
cmpnlessxmm, xmm/m32F3 0F C2 /r 06Comparison of one single for not less or equal, the result is a maskfor every element: dst[i] = (dst[i] nle src[i]) ? all 1 bits : 0SSE floating point
cmpnltpdxmm, xmm/m12866 0F C2 /r 05Comparison of 2 doubles for not less, the result is a maskfor every element: dst[i] = (dst[i] nlt src[i]) ? all 1 bits : 0SSE floating point
cmpnltpsxmm, xmm/m1280F C2 /r 05Comparison of 4 singles for not less, the result is a maskfor every element: dst[i] = (dst[i] nlt src[i]) ? all 1 bits : 0SSE floating point
cmpnltsdxmm, xmm/m64F2 0F C2 /r 05Comparison of one double for not less, the result is a maskfor every element: dst[i] = (dst[i] nlt src[i]) ? all 1 bits : 0SSE floating point
cmpnltssxmm, xmm/m32F3 0F C2 /r 05Comparison of one single for not less, the result is a maskfor every element: dst[i] = (dst[i] nlt src[i]) ? all 1 bits : 0SSE floating point
cmpordpdxmm, xmm/m12866 0F C2 /r 07Comparison of 2 doubles for ordered (no NaN), the result is a maskfor every element: dst[i] = (dst[i] ord src[i]) ? all 1 bits : 0SSE floating point
cmpordpsxmm, xmm/m1280F C2 /r 07Comparison of 4 singles for ordered (no NaN), the result is a maskfor every element: dst[i] = (dst[i] ord src[i]) ? all 1 bits : 0SSE floating point
cmpordsdxmm, xmm/m64F2 0F C2 /r 07Comparison of one double for ordered (no NaN), the result is a maskfor every element: dst[i] = (dst[i] ord src[i]) ? all 1 bits : 0SSE floating point
cmpordssxmm, xmm/m32F3 0F C2 /r 07Comparison of one single for ordered (no NaN), the result is a maskfor every element: dst[i] = (dst[i] ord src[i]) ? all 1 bits : 0SSE floating point
cmppdxmm, xmm/m128, imm866 0F C2 /r ibComparison of 2 doubles with a condition, the result is a maskfor every element: dst[i] = (dst[i] predicate src[i]) ? all 1 bits : 0; the predicate is imm8SSE floating point
cmppsxmm, xmm/m128, imm80F C2 /r ibComparison of 4 singles with a condition, the result is a maskfor every element: dst[i] = (dst[i] predicate src[i]) ? all 1 bits : 0; the predicate is imm8SSE floating point
cmpsbA6Comparison of [esi] with [edi], esi and edi advanceflags = [esi] - [edi]; esi, edi = +/- size; with repe / repne: repeat while equal / not equal, at most ecx timesFlags: OF SF ZF AF CF PFStrings
cmpsdA7Comparison of one double (xmm) with a condition; without operands: string comparefor every element: dst[i] = (dst[i] predicate src[i]) ? all 1 bits : 0; the predicate is imm8SSE floating point
xmm, xmm/m64, imm8F2 0F C2 /r ib
cmpssxmm, xmm/m32, imm8F3 0F C2 /r ibComparison of one single with a condition, the result is a maskfor every element: dst[i] = (dst[i] predicate src[i]) ? all 1 bits : 0; the predicate is imm8SSE floating point
cmpsw66 A7Comparison of [esi] with [edi], esi and edi advanceflags = [esi] - [edi]; esi, edi = +/- size; with repe / repne: repeat while equal / not equal, at most ecx timesFlags: OF SF ZF AF CF PFStrings
cmpunordpdxmm, xmm/m12866 0F C2 /r 03Comparison of 2 doubles for unordered (NaN), the result is a maskfor every element: dst[i] = (dst[i] unord src[i]) ? all 1 bits : 0SSE floating point
cmpunordpsxmm, xmm/m1280F C2 /r 03Comparison of 4 singles for unordered (NaN), the result is a maskfor every element: dst[i] = (dst[i] unord src[i]) ? all 1 bits : 0SSE floating point
cmpunordsdxmm, xmm/m64F2 0F C2 /r 03Comparison of one double for unordered (NaN), the result is a maskfor every element: dst[i] = (dst[i] unord src[i]) ? all 1 bits : 0SSE floating point
cmpunordssxmm, xmm/m32F3 0F C2 /r 03Comparison of one single for unordered (NaN), the result is a maskfor every element: dst[i] = (dst[i] unord src[i]) ? all 1 bits : 0SSE floating point
cmpxchgr/m8, r80F B0 /rCompare and exchange if equal (atomic with lock)if eax == dst then { ZF = 1; dst = src } else { ZF = 0; eax = dst }Flags: OF SF ZF AF CF PFCompare and exchange
r/m32, r320F B1 /r
r/m16, r1666 0F B1 /r
cmpxchg8bm0F C7 /1Compare and exchange of 8 bytes (edx:eax, ecx:ebx)if edx:eax == [m] then { ZF = 1; [m] = ecx:ebx } else { ZF = 0; edx:eax = [m] }Flags: ZFCompare and exchange
comisdxmm, xmm/m6466 0F 2F /rComparison of two doubles, sets ZF, PF, CFZF PF CF = compare(dst, src): greater 0 0 0, less 0 0 1, equal 1 0 0, unordered 1 1 1; OF SF AF = 0Flags: OF SF ZF AF CF PFSSE floating point
comissxmm, xmm/m320F 2F /rComparison of two singles, sets ZF, PF, CFZF PF CF = compare(dst, src): greater 0 0 0, less 0 0 1, equal 1 0 0, unordered 1 1 1; OF SF AF = 0Flags: OF SF ZF AF CF PFSSE floating point
cpuid0F A2Information about the processoreax, ebx, ecx, edx = information about the processor for the function in eax (and ecx)System and privileged
crc32r32, r/m8F2 0F 38 F0 /rCalculation of a CRC-32C checksum (Castagnoli)dst = crc32c(dst, src)Arithmetic
r32, r/m32F2 0F 38 F1 /r
cvtdq2pdxmm, xmm/m64F3 0F E6 /rConversion of 2 integers (32 bit) to doublesfor every element: dst[i] = convert(src[i]) from int32 to doubleConversions
cvtdq2psxmm, xmm/m1280F 5B /rConversion of 4 integers (32 bit) to singlesfor every element: dst[i] = convert(src[i]) from int32 to singleConversions
cvtpd2dqxmm, xmm/m128F2 0F E6 /rConversion of 2 doubles to integers (rounded)for every element: dst[i] = convert(src[i]) from double to int32Conversions
cvtpd2pimm, xmm/m6466 0F 2D /rConversion of 2 doubles to integers (mm, rounded)for every element: dst[i] = convert(src[i]) from double to int32Conversions
cvtpd2psxmm, xmm/m12866 0F 5A /rConversion of 2 doubles to singlesfor every element: dst[i] = convert(src[i]) from double to singleConversions
cvtpi2pdxmm, mm/m6466 0F 2A /rConversion of 2 integers (mm) to doublesfor every element: dst[i] = convert(src[i]) from int32 to doubleConversions
cvtpi2psxmm, mm/m640F 2A /rConversion of 2 integers (mm) to singlesfor every element: dst[i] = convert(src[i]) from int32 to singleConversions
cvtps2dqxmm, xmm/m12866 0F 5B /rConversion of 4 singles to integers (rounded)for every element: dst[i] = convert(src[i]) from single to int32Conversions
cvtps2pdxmm, xmm/m640F 5A /rConversion of 2 singles to doublesfor every element: dst[i] = convert(src[i]) from single to doubleConversions
cvtps2pimm, xmm/m640F 2D /rConversion of 2 singles to integers (mm, rounded)for every element: dst[i] = convert(src[i]) from single to int32Conversions
cvtsd2sir32, xmm/m128F2 0F 2D /rConversion of a double to an integer (rounded)for every element: dst[i] = convert(src[i]) from double to integerConversions
cvtsd2ssxmm, xmm/m128F2 0F 5A /rConversion of a double to a singlefor every element: dst[i] = convert(src[i]) from double to singleConversions
cvtsi2sdxmm, r/m32F2 0F 2A /rConversion of an integer to a doublefor every element: dst[i] = convert(src[i]) from integer to doubleConversions
cvtsi2ssxmm, r/m32F3 0F 2A /rConversion of an integer to a singlefor every element: dst[i] = convert(src[i]) from integer to singleConversions
cvtss2sdxmm, xmm/m32F3 0F 5A /rConversion of a single to a doublefor every element: dst[i] = convert(src[i]) from single to doubleConversions
cvtss2sir32, xmm/m32F3 0F 2D /rConversion of a single to an integer (rounded)for every element: dst[i] = convert(src[i]) from single to integerConversions
cvttpd2dqxmm, xmm/m12866 0F E6 /rConversion of 2 doubles to integers (truncated)for every element: dst[i] = truncate(src[i]) from double to int32Conversions
cvttpd2pimm, xmm/m6466 0F 2C /rConversion of 2 doubles to integers (mm, truncated)for every element: dst[i] = truncate(src[i]) from double to int32Conversions
cvttps2dqxmm, xmm/m128F3 0F 5B /rConversion of 4 singles to integers (truncated)for every element: dst[i] = truncate(src[i]) from single to int32Conversions
cvttps2pimm, xmm/m640F 2C /rConversion of 2 singles to integers (mm, truncated)for every element: dst[i] = truncate(src[i]) from single to int32Conversions
cvttsd2sir32, xmm/m128F2 0F 2C /rConversion of a double to an integer (truncated)for every element: dst[i] = truncate(src[i]) from double to integerConversions
cvttss2sir32, xmm/m32F3 0F 2C /rConversion of a single to an integer (truncated)for every element: dst[i] = truncate(src[i]) from single to integerConversions
cwd66 99Sign extension of ax into dx:axdx:ax = sext(ax)Data transfer
cwde98Sign extension of ax into eaxeax = sext(ax)Data transfer
daa27Decimal adjust after an addition (packed BCD)if (al & 15) > 9 or AF = 1 then al = al + 6; if al > 99h or CF = 1 then al = al + 60hFlags: SF ZF AF CF PF · undefined: OFArithmetic
das2FDecimal adjust after a subtraction (packed BCD)if (al & 15) > 9 or AF = 1 then al = al - 6; if al > 99h or CF = 1 then al = al - 60hFlags: SF ZF AF CF PF · undefined: OFArithmetic
decr/m8FE /1Decrement by 1 (CF is unchanged)dst = dst - 1Flags: OF SF ZF AF PFArithmetic
r/m32FF /1
r/m1666 FF /1
divax, r/m8F6 /6Unsigned division: edx:eax by the operand, quotient to eax, remainder to edxeax = edx:eax / src; edx = edx:eax % src (8 bit: al = ax / src; ah = ax % src); #DE if src = 0 or quotient too big (unsigned)Flags: – · undefined: OF SF ZF AF CF PFArithmetic
eax, r/m32F7 /6
ax, r/m1666 F7 /6
divpdxmm, xmm/m12866 0F 5E /rDivision of 2 doublesfor every element: dst[i] = dst[i] / src[i] (double)SSE floating point
divpsxmm, xmm/m1280F 5E /rDivision of 4 singlesfor every element: dst[i] = dst[i] / src[i] (single)SSE floating point
divsdxmm, xmm/m64F2 0F 5E /rDivision of one doubledst[0] = dst[0] / src[0] (double); the other elements staySSE floating point
divssxmm, xmm/m32F3 0F 5E /rDivision of one singledst[0] = dst[0] / src[0] (single); the other elements staySSE floating point
dppdxmm, xmm/m128, imm866 0F 3A 41 /r ibDot product of doublesdst[i] = sum of dst[j] * src[j] for the elements chosen by imm8 (high bits), written to the elements chosen by imm8 (low bits)SSE floating point
dppsxmm, xmm/m128, imm866 0F 3A 40 /r ibDot product of singlesdst[i] = sum of dst[j] * src[j] for the elements chosen by imm8 (high bits), written to the elements chosen by imm8 (low bits)SSE floating point
emms0F 77End of MMX and freeing of the x87 registersmark all x87 registers as empty (after MMX)System and privileged
endbr32F3 0F 1E FBMarking of a valid branch target (control-flow protection)marks a valid target of an indirect jump (no change)Barriers and others
endbr64F3 0F 1E FAMarking of a valid branch target (control-flow protection)marks a valid target of an indirect jump (no change)Barriers and others
enterimm16, imm8C8 iw ibBuilding of a stack frame (rare, usually push/mov)push(ebp); ebp = esp; esp = esp - size (nesting level 0)Stack
extractpsr/m32, xmm, imm866 0F 3A 17 /r ibExtraction of a single from xmm into a register or memorydst = one single of src, chosen by imm8SSE and MMX data movement
f2xm1D9 F02 to the power st0 minus 1st0 = 2 ^ st0 - 1Floating point (x87)
fabsD9 E1Absolute value of st0st0 = abs(st0)Floating point (x87)
faddm32D8 /0Addition (st0 = st0 + operand)st0 = st0 + src (or st(i) = st(i) + st0)Floating point (x87)
st0, st(i)D8 /0
m64DC /0
st(i), st0DC /0
faddpst(i), st0DE /0Addition with popst(i) = st(i) + st0; popFloating point (x87)
fbldm80DF /4Load of a packed decimal number (BCD)push: st0 = packed decimal srcFloating point (x87)
fbstpm80DF /6Store of st0 as a packed decimal number and popdst = st0 as packed decimal; popFloating point (x87)
fchsD9 E0Sign change of st0st0 = -st0Floating point (x87)
fcmovbst0, st(i)DA /0Copy of st(i) to st0 if CF=1if CF = 1 then st0 = st(i)Floating point (x87)
fcmovbest0, st(i)DA /2Copy of st(i) to st0 if CF=1 or ZF=1if CF = 1 or ZF = 1 then st0 = st(i)Floating point (x87)
fcmovest0, st(i)DA /1Copy of st(i) to st0 if ZF=1if ZF = 1 then st0 = st(i)Floating point (x87)
fcmovnbst0, st(i)DB /0Copy of st(i) to st0 if CF=0if CF = 0 then st0 = st(i)Floating point (x87)
fcmovnbest0, st(i)DB /2Copy of st(i) to st0 if CF=0 and ZF=0if CF = 0 and ZF = 0 then st0 = st(i)Floating point (x87)
fcmovnest0, st(i)DB /1Copy of st(i) to st0 if ZF=0if ZF = 0 then st0 = st(i)Floating point (x87)
fcmovnust0, st(i)DB /3Copy of st(i) to st0 if PF=0if PF = 0 then st0 = st(i)Floating point (x87)
fcmovust0, st(i)DA /3Copy of st(i) to st0 if PF=1if PF = 1 then st0 = st(i)Floating point (x87)
fcomst(i)/m32D8 /2Comparison of st0 with an operand (status word)status word C3 C2 C0 = compare(st0, src)Flags: C0 C2 C3Floating point (x87)
m64DC /2
fcomist0, st(i)DB /6Comparison setting ZF, PF, CF directlyZF PF CF = compare(st0, st(i))Flags: ZF CF PFFloating point (x87)
fcomipst0, st(i)DF /6Comparison setting ZF, PF, CF with pop of st0ZF PF CF = compare(st0, st(i)); popFlags: ZF CF PFFloating point (x87)
fcompst(i)/m32D8 /3Comparison with pop of st0status word C3 C2 C0 = compare(st0, src); popFlags: C0 C2 C3Floating point (x87)
m64DC /3
fcomppDE D9Comparison of st0 with st1 and pop of bothstatus word C3 C2 C0 = compare(st0, st1); pop twiceFlags: C0 C2 C3Floating point (x87)
fcosD9 FFCosine of st0st0 = cos(st0)Floating point (x87)
fdecstpD9 F6Decrement of the x87 stack pointertop of the x87 stack = top - 1Floating point (x87)
fdivm32D8 /6Divisionst0 = st0 / src (or st(i) = st(i) / st0)Floating point (x87)
st0, st(i)D8 /6
m64DC /6
st(i), st0DC /7
fdivpst(i), st0DE /7Division with popst(i) = st(i) / st0; popFloating point (x87)
fdivrm32D8 /7Division in reverse orderst0 = src / st0 (or st(i) = st0 / st(i))Floating point (x87)
st0, st(i)D8 /7
st(i), st0DC /6
m64DC /7
fdivrpst(i), st0DE /6Reverse division with popst(i) = st0 / st(i); popFloating point (x87)
ffreest(i)DD /0Freeing of an x87 registermark st(i) as emptyFloating point (x87)
fiaddm32DA /0Addition of an integer from memoryst0 = st0 + (float) integer srcFloating point (x87)
m16DE /0
ficomm32DA /2Comparison of st0 with an integerstatus word C3 C2 C0 = compare(st0, integer src)Flags: C0 C2 C3Floating point (x87)
m16DE /2
ficompm32DA /3Comparison with an integer and pop of st0status word C3 C2 C0 = compare(st0, integer src); popFlags: C0 C2 C3Floating point (x87)
m16DE /3
fidivm32DA /6Division by an integer from memoryst0 = st0 / (float) integer srcFloating point (x87)
m16DE /6
fidivrm32DA /7Division of an integer by st0 (reversed)st0 = (float) integer src / st0Floating point (x87)
m16DE /7
fildm32DB /0Load of an integer onto the x87 stackpush: st0 = (float) integer srcFloating point (x87)
m16DF /0
m64DF /5
fimulm32DA /1Multiplication by an integer from memoryst0 = st0 * (float) integer srcFloating point (x87)
m16DE /1
fincstpD9 F7Increment of the x87 stack pointertop of the x87 stack = top + 1Floating point (x87)
fistm32DB /2Store of st0 as an integer (rounded)dst = (integer) st0, roundedFloating point (x87)
m16DF /2
fistpm32DB /3Store of st0 as an integer and popdst = (integer) st0, rounded; popFloating point (x87)
m16DF /3
m64DF /7
fisttpm32DB /1Store of st0 as an integer (truncated) and popdst = (integer) st0, truncated; popFloating point (x87)
m64DD /1
m16DF /1
fisubm32DA /4Subtraction of an integer from memoryst0 = st0 - (float) integer srcFloating point (x87)
m16DE /4
fisubrm32DA /5Reverse subtraction of an integer from memoryst0 = (float) integer src - st0Floating point (x87)
m16DE /5
fldst(i)/m32D9 /0Load of a value onto the x87 stackpush: st0 = srcFloating point (x87)
m80DB /5
m64DD /0
fld1D9 E8Load of the constant 1.0push: st0 = 1.0Floating point (x87)
fldcwm16D9 /5Load of the x87 control wordx87 control word = [m16]Floating point (x87)
fldenvmD9 /4Load of the x87 environmentx87 environment = [m]Floating point (x87)
fldl2eD9 EALoad of log2(e)push: st0 = log2(e)Floating point (x87)
fldl2tD9 E9Load of log2(10)push: st0 = log2(10)Floating point (x87)
fldlg2D9 ECLoad of log10(2)push: st0 = log10(2)Floating point (x87)
fldln2D9 EDLoad of ln(2)push: st0 = ln(2)Floating point (x87)
fldpiD9 EBLoad of the constant πpush: st0 = piFloating point (x87)
fldzD9 EELoad of the constant 0.0push: st0 = 0.0Floating point (x87)
fmulm32D8 /1Multiplicationst0 = st0 * src (or st(i) = st(i) * st0)Floating point (x87)
st0, st(i)D8 /1
m64DC /1
st(i), st0DC /1
fmulpst(i), st0DE /1Multiplication with popst(i) = st(i) * st0; popFloating point (x87)
fnclexDB E2Clearing of the x87 exceptionsclear the x87 exception flagsFloating point (x87)
fninitDB E3Reset of the x87 unitreset the x87 unitFloating point (x87)
fnopD9 D0No operation (x87)no operationFloating point (x87)
fnsavemDD /6Store of the whole x87 state[m] = whole x87 state; then reset the unitFloating point (x87)
fnstcwm16D9 /7Store of the x87 control word[m16] = x87 control wordFloating point (x87)
fnstenvmD9 /6Store of the x87 environment[m] = x87 environmentFloating point (x87)
fnstswm16DD /7Store of the x87 status worddst = x87 status wordFloating point (x87)
axDF E0
fpatanD9 F3Arc tangent of st1/st0st1 = atan(st1 / st0); popFloating point (x87)
fpremD9 F8Remainder of a division (partial)st0 = st0 mod st1 (truncating quotient, partial)Floating point (x87)
fprem1D9 F5IEEE remainder of a divisionst0 = IEEE remainder of st0 / st1 (partial)Floating point (x87)
fptanD9 F2Tangent of st0st0 = tan(st0); push: st0 = 1.0Floating point (x87)
frndintD9 FCRounding of st0 to a whole numberst0 = round(st0) to an integer valueFloating point (x87)
frstormDD /4Restoring of the whole x87 statewhole x87 state = [m]Floating point (x87)
fscaleD9 FDMultiplication of st0 by 2 to the power st1st0 = st0 * 2 ^ trunc(st1)Floating point (x87)
fsinD9 FESine of st0st0 = sin(st0)Floating point (x87)
fsincosD9 FBSine and cosine of st0st0 = sin(st0); push: st0 = cosFloating point (x87)
fsqrtD9 FASquare root of st0st0 = sqrt(st0)Floating point (x87)
fstm32D9 /2Store of st0 (without popping)dst = st0Floating point (x87)
st(i)/m64DD /2
fstpm32D9 /3Store of st0 and popdst = st0; popFloating point (x87)
m80DB /7
st(i)/m64DD /3
fsubm32D8 /4Subtractionst0 = st0 - src (or st(i) = st(i) - st0)Floating point (x87)
st0, st(i)D8 /4
m64DC /4
st(i), st0DC /5
fsubpst(i), st0DE /5Subtraction with popst(i) = st(i) - st0; popFloating point (x87)
fsubrm32D8 /5Subtraction in reverse orderst0 = src - st0 (or st(i) = st0 - st(i))Floating point (x87)
st0, st(i)D8 /5
st(i), st0DC /4
m64DC /5
fsubrpst(i), st0DE /4Reverse subtraction with popst(i) = st0 - st(i); popFloating point (x87)
ftstD9 E4Comparison of st0 with 0.0status word C3 C2 C0 = compare(st0, 0.0)Flags: C0 C2 C3Floating point (x87)
fucomst(i)DD /4Unordered comparison (no fault on NaN)status word C3 C2 C0 = compare(st0, src)Flags: C0 C2 C3Floating point (x87)
fucomist0, st(i)DB /5Unordered comparison, sets ZF, PF, CFZF PF CF = compare(st0, st(i))Flags: ZF CF PFFloating point (x87)
fucomipst0, st(i)DF /5Unordered comparison, sets ZF, PF, CF, with pop of st0ZF PF CF = compare(st0, st(i)); popFlags: ZF CF PFFloating point (x87)
fucompst(i)DD /5Unordered comparison with pop of st0status word C3 C2 C0 = compare(st0, src); popFlags: C0 C2 C3Floating point (x87)
fucomppDA E9Unordered comparison of st0, st1 with pop of bothstatus word C3 C2 C0 = compare(st0, st1); pop twiceFlags: C0 C2 C3Floating point (x87)
fwait9BWait for the x87 unitwait until the x87 unit is done and report its errorsBarriers and others
fxamD9 E5Examination of the kind of st0 (number, NaN, ...)status word C3 C2 C1 C0 = kind of st0 (number, zero, infinity, NaN, ...)Flags: C0 C1 C2 C3Floating point (x87)
fxchst(i)D9 /1Exchange of st0 with another registerswap(st0, st(i))Floating point (x87)
fxrstorm0F AE /1Restoring of the x87, MMX and SSE statex87, MMX and SSE state = [m]System and privileged
fxsavem0F AE /0Saving of the x87, MMX and SSE state[m] = x87, MMX and SSE state (512 bytes)System and privileged
fxtractD9 F4Splitting of st0 into exponent and mantissast0 = exponent of st0; push: st0 = significandFloating point (x87)
fyl2xD9 F1st1 times log2(st0)st1 = st1 * log2(st0); popFloating point (x87)
fyl2xp1D9 F9st1 times log2(st0 + 1)st1 = st1 * log2(st0 + 1); popFloating point (x87)
getsec0F 37Security extension instructions (Intel TXT)run the safer-mode function selected by eax (Intel TXT)System and privileged
haddpdxmm, xmm/m12866 0F 7C /rAddition of adjacent doubles (horizontal)dst = (dst[0] + dst[1], dst[2] + dst[3], src[0] + src[1], src[2] + src[3])SSE floating point
haddpsxmm, xmm/m128F2 0F 7C /rAddition of adjacent singles (horizontal)dst = (dst[0] + dst[1], dst[2] + dst[3], src[0] + src[1], src[2] + src[3])SSE floating point
hltF4Halt of the processor (until the next interrupt)stop until the next interrupt (privileged)System and privileged
hsubpdxmm, xmm/m12866 0F 7D /rSubtraction of adjacent doubles (horizontal)dst = (dst[0] - dst[1], dst[2] - dst[3], src[0] - src[1], src[2] - src[3])SSE floating point
hsubpsxmm, xmm/m128F2 0F 7D /rSubtraction of adjacent singles (horizontal)dst = (dst[0] - dst[1], dst[2] - dst[3], src[0] - src[1], src[2] - src[3])SSE floating point
idivax, r/m8F6 /7Signed division: edx:eax by the operand, quotient to eax, remainder to edxeax = edx:eax / src; edx = edx:eax % src (8 bit: al = ax / src; ah = ax % src); #DE if src = 0 or quotient too big (signed)Flags: – · undefined: OF SF ZF AF CF PFArithmetic
eax, r/m32F7 /7
ax, r/m1666 F7 /7
imulr32, r/m32, imm3269 /r idSigned multiplication (one, two or three operands)1 operand: edx:eax = eax * src (signed); 2: dst = dst * src; 3: dst = src * immFlags: OF CF · undefined: SF ZF AF PFArithmetic
r16, r/m16, imm1666 69 /r iw
r32, r/m32, imm86B /r ib
r16, r/m16, imm866 6B /r ib
r/m8F6 /5
r/m32F7 /5
r1666 F7 /5
r32, r/m320F AF /r
r16, r/m1666 0F AF /r
inal, imm8E4 ibRead of a value from an I/O portdst = port[src]Data transfer
eax, imm8E5 ib
ax, imm866 E5 ib
al, dxEC
eax, dxED
ax, dx66 ED
incr/m8FE /0Increment by 1 (CF is unchanged)dst = dst + 1Flags: OF SF ZF AF PFArithmetic
r/m32FF /0
r/m1666 FF /0
insb6CRead of a port to [edi], edi advances[edi] = port[dx]; edi = edi +/- sizeStrings
insd6DRead of a port to [edi], edi advances[edi] = port[dx]; edi = edi +/- sizeStrings
insertpsxmm, xmm/m32, imm866 0F 3A 21 /r ibInsertion of a single into xmmdst = dst with one single replaced by one of src (and zeroed ones), chosen by imm8SSE and MMX data movement
insw66 6DRead of a port to [edi], edi advances[edi] = port[dx]; edi = edi +/- sizeStrings
intimm8CD ibRaising of a software interruptpush(flags, cs, eip); jump to the handler of vector imm8Flags: IF TFJumps, calls and interrupts
int1F1Raising of debug interrupt 1interrupt 1 (debug exception)Jumps, calls and interrupts
int3CCBreakpoint (interrupt 3, one byte)interrupt 3 (breakpoint)Jumps, calls and interrupts
intoCEInterrupt 4 if OF=1if OF = 1 then interrupt 4System and privileged
invd0F 08Invalidation of the caches without write-back (privileged)empty the caches without writing back (privileged)System and privileged
invlpgm0F 01 /7Invalidation of a TLB entryremove the translation of the page of [m] from the TLB (privileged)System and privileged
iretdCFReturn from an interrupt (32 bit)eip, cs, flags = pop(); (64 bit and on a change of level: esp, ss = pop())Flags: allJumps, calls and interrupts
iretw66 CFReturn from an interrupt (16 bit)eip, cs, flags = pop(); (64 bit and on a change of level: esp, ss = pop())Flags: allJumps, calls and interrupts
jarel877 cbJump if unsigned above (CF=0 and ZF=0)if CF = 0 and ZF = 0 then eip = targetJumps, calls and interrupts
rel866 77 cb
rel320F 87 cd
rel1666 0F 87 cw
jberel876 cbJump if unsigned below or equal (CF=1 or ZF=1)if CF = 1 or ZF = 1 then eip = targetJumps, calls and interrupts
rel866 76 cb
rel320F 86 cd
rel1666 0F 86 cw
jcrel872 cbJump if carry, unsigned below (CF=1)if CF = 1 then eip = targetJumps, calls and interrupts
rel866 72 cb
rel320F 82 cd
rel1666 0F 82 cw
jecxzrel8E3 cbJump if ecx is 0if ecx == 0 then eip = targetJumps, calls and interrupts
rel866 E3 cb
jgrel87F cbJump if signed greater (ZF=0 and SF=OF)if ZF = 0 and SF = OF then eip = targetJumps, calls and interrupts
rel866 7F cb
rel320F 8F cd
rel1666 0F 8F cw
jgerel87D cbJump if signed greater or equal (SF=OF)if SF = OF then eip = targetJumps, calls and interrupts
rel866 7D cb
rel320F 8D cd
rel1666 0F 8D cw
jlrel87C cbJump if signed less (SF≠OF)if SF != OF then eip = targetJumps, calls and interrupts
rel866 7C cb
rel320F 8C cd
rel1666 0F 8C cw
jlerel87E cbJump if signed less or equal (ZF=1 or SF≠OF)if ZF = 1 or SF != OF then eip = targetJumps, calls and interrupts
rel866 7E cb
rel320F 8E cd
rel1666 0F 8E cw
jmprel32E9 cdJump to an addresseip = targetJumps, calls and interrupts
rel1666 E9 cw
rel8EB cb
rel866 EB cb
r/m32FF /4
mFF /5
r/m1666 FF /4
jncrel873 cbJump if no carry, unsigned above or equal (CF=0)if CF = 0 then eip = targetJumps, calls and interrupts
rel866 73 cb
rel320F 83 cd
rel1666 0F 83 cw
jnorel871 cbJump if no overflow (OF=0)if OF = 0 then eip = targetJumps, calls and interrupts
rel866 71 cb
rel320F 81 cd
rel1666 0F 81 cw
jnprel87B cbJump if parity odd (PF=0)if PF = 0 then eip = targetJumps, calls and interrupts
rel866 7B cb
rel320F 8B cd
rel1666 0F 8B cw
jnsrel879 cbJump if not negative (SF=0)if SF = 0 then eip = targetJumps, calls and interrupts
rel866 79 cb
rel320F 89 cd
rel1666 0F 89 cw
jnzrel875 cbJump if not equal, result not zero (ZF=0)if ZF = 0 then eip = targetJumps, calls and interrupts
rel866 75 cb
rel320F 85 cd
rel1666 0F 85 cw
jorel870 cbJump if overflow (OF=1)if OF = 1 then eip = targetJumps, calls and interrupts
rel866 70 cb
rel320F 80 cd
rel1666 0F 80 cw
jprel87A cbJump if parity even (PF=1)if PF = 1 then eip = targetJumps, calls and interrupts
rel866 7A cb
rel320F 8A cd
rel1666 0F 8A cw
jsrel878 cbJump if negative (SF=1)if SF = 1 then eip = targetJumps, calls and interrupts
rel866 78 cb
rel320F 88 cd
rel1666 0F 88 cw
jzrel874 cbJump if equal, result zero (ZF=1)if ZF = 1 then eip = targetJumps, calls and interrupts
rel866 74 cb
rel320F 84 cd
rel1666 0F 84 cw
lahf9FLoad of the flags into ahah = SF:ZF:0:AF:0:PF:1:CFFlags
larr32, r32/m160F 02 /rLoad of the access rights of a segmentdst = access rights of the segment src; ZF = 1 if it is validFlags: ZFSystem and privileged
r16, r32/m1666 0F 02 /r
lddquxmm, m128F2 0F F0 /rLoad of 128 bits unaligned (fast across cache lines)dst = src (128 bits; any alignment)SSE and MMX data movement
ldmxcsrm0F AE /2Load of the SSE control and status registerMXCSR = [m32]SSE and MMX data movement
ldsr32, mC5 /rLoad of a far pointer into ds:registerdst = [m]; ds = [m + 4]Data transfer
r16, m66 C5 /r
lear32, m8D /rCalculation of an address and storing of the address, without a memory accessdst = address of src (no memory access)Data transfer
r16, m66 8D /r
leaveC9Tearing down of the stack frame (mov esp, ebp; pop ebp)esp = ebp; ebp = pop()Stack
lesr32, mC4 /rLoad of a far pointer into es:registerdst = [m]; es = [m + 4]Data transfer
r16, m66 C4 /r
lfence0F AE /5Barrier for loadsall earlier loads are done before later instructionsBarriers and others
lgdtm0F 01 /2Load of the global descriptor table registerGDTR = [m] (privileged)System and privileged
lidtm0F 01 /3Load of the interrupt descriptor table registerIDTR = [m] (privileged)System and privileged
lldtr/m160F 00 /2Load of the local descriptor table registerLDTR = src (privileged)System and privileged
lmswm0F 01 /6Load of the machine status word (low bits of cr0)CR0 bits 0 to 15 = src (privileged)System and privileged
lodsbACLoad of [esi] into al/ax/eax, esi advancesacc = [esi]; esi = esi +/- size (acc is al, ax or eax)Strings
lodsdADLoad of [esi] into al/ax/eax, esi advancesacc = [esi]; esi = esi +/- size (acc is al, ax or eax)Strings
lodsw66 ADLoad of [esi] into al/ax/eax, esi advancesacc = [esi]; esi = esi +/- size (acc is al, ax or eax)Strings
looprel8E2 cbDecrement of ecx and jump while it is not 0ecx = ecx - 1; if ecx != 0 then eip = targetJumps, calls and interrupts
rel866 E2 cb
looperel8E1 cbLike loop, but only if ZF=1ecx = ecx - 1; if ecx != 0 and ZF = 1 then eip = targetJumps, calls and interrupts
rel866 E1 cb
loopnerel8E0 cbLike loop, but only if ZF=0ecx = ecx - 1; if ecx != 0 and ZF = 0 then eip = targetJumps, calls and interrupts
rel866 E0 cb
lslr32, r32/m160F 03 /rLoad of the limit of a segmentdst = limit of the segment src; ZF = 1 if it is validFlags: ZFSystem and privileged
r16, r32/m1666 0F 03 /r
ltrr/m160F 00 /3Load of the task registertask register = src (privileged)System and privileged
lzcntr32, r/m32F3 0F BD /rCount of the leading zero bitsdst = number of leading 0 bits of src (width if src = 0)Flags: ZF CFArithmetic
maskmovdquxmm, xmm66 0F F7 /rStore of only the bytes chosen by a mask (xmm)for each byte whose mask bit (the top bit) is 1: [edi + i] = dst[i]SSE and MMX data movement
maskmovqmm, mm0F F7 /rStore of only the bytes chosen by a mask (mm)for each byte whose mask bit (the top bit) is 1: [edi + i] = dst[i]SSE and MMX data movement
maxpdxmm, xmm/m12866 0F 5F /rMaximum of 2 doublesfor every element: dst[i] = max(dst[i], src[i])SSE floating point
maxpsxmm, xmm/m1280F 5F /rMaximum of 4 singlesfor every element: dst[i] = max(dst[i], src[i])SSE floating point
maxsdxmm, xmm/m64F2 0F 5F /rMaximum of one doubledst[0] = max(dst[0], src[0]); the other elements staySSE floating point
maxssxmm, xmm/m32F3 0F 5F /rMaximum of one singledst[0] = max(dst[0], src[0]); the other elements staySSE floating point
mfence0F AE /6Barrier for all memory accessesall earlier loads and stores are done before later onesBarriers and others
minpdxmm, xmm/m12866 0F 5D /rMinimum of 2 doublesfor every element: dst[i] = min(dst[i], src[i])SSE floating point
minpsxmm, xmm/m1280F 5D /rMinimum of 4 singlesfor every element: dst[i] = min(dst[i], src[i])SSE floating point
minsdxmm, xmm/m64F2 0F 5D /rMinimum of one doubledst[0] = min(dst[0], src[0]); the other elements staySSE floating point
minssxmm, xmm/m32F3 0F 5D /rMinimum of one singledst[0] = min(dst[0], src[0]); the other elements staySSE floating point
monitor0F 01 C8Arming of the monitoring of an address for mwaitwatch the address in eax (for mwait)System and privileged
monitorx0F 01 FAArming of the monitoring of an address for mwaitwatch the address in eax (for mwait)System and privileged
movr/m8, r888 /rCopy of the source to the destinationdst = srcData transfer
r/m32, r3289 /r
r/m16, r1666 89 /r
r8, r/m88A /r
r32, r/m328B /r
r16, r/m1666 8B /r
r32/m16, Sreg8C /r
r16, Sreg66 8C /r
Sreg, r32/m168E /r
r8, imm8B0+rb ib
r32, imm32B8+rd id
r16, imm1666 B8+rw iw
r/m8, imm8C6 /0 ib
r/m32, imm32C7 /0 id
r/m16, imm1666 C7 /0 iw
r32, CRn0F 20 /r
r32, DRn0F 21 /r
CRn, r320F 22 /r
DRn, r320F 23 /r
movapdxmm, xmm/m12866 0F 28 /rCopy of 2 double floats (128 bits), memory 16-byte aligneddst = src (128 bits; memory must be 16-byte aligned)SSE and MMX data movement
xmm/m128, xmm66 0F 29 /r
movapsxmm, xmm/m1280F 28 /rCopy of 4 single floats (128 bits), memory 16-byte aligneddst = src (128 bits; memory must be 16-byte aligned)SSE and MMX data movement
xmm/m128, xmm0F 29 /r
movber32, m0F 38 F0 /rCopy with byte reversaldst = reverse_bytes(src)Data transfer
r16, m66 0F 38 F0 /r
m, r320F 38 F1 /r
m, r1666 0F 38 F1 /r
movdmm, r/m320F 6E /rCopy of 32 bits between an integer register/memory and xmm/mmdst = src (32 bits; into xmm / mm the upper bits become 0)SSE and MMX data movement
xmm, r/m3266 0F 6E /r
r/m32, mm0F 7E /r
r/m32, xmm66 0F 7E /r
movddupxmm, xmm/m64F2 0F 12 /rDuplication of the low double into both halvesdst = (src[63:0], src[63:0])SSE and MMX data movement
movdq2qmm, xmmF2 0F D6 /rCopy of the low half of xmm to mmdst = src[63:0] (xmm to mm)SSE and MMX data movement
movdqaxmm, xmm/m12866 0F 6F /rCopy of 128 bits of integers, memory 16-byte aligneddst = src (128 bits; memory must be 16-byte aligned)SSE and MMX data movement
xmm/m128, xmm66 0F 7F /r
movdquxmm, xmm/m128F3 0F 6F /rCopy of 128 bits of integers, any alignmentdst = src (128 bits; any alignment)SSE and MMX data movement
xmm/m128, xmmF3 0F 7F /r
movhlpsxmm, xmm0F 12 /rCopy of the high half of the source xmm to the low halfdst[63:0] = src[127:64]SSE and MMX data movement
movhpdxmm, m6466 0F 16 /rCopy of 1 double to (or from) the high half of xmmload: dst[127:64] = [m64]; store: [m64] = src[127:64]SSE and MMX data movement
m64, xmm66 0F 17 /r
movhpsxmm, m640F 16 /rCopy of 2 singles to (or from) the high half of xmmload: dst[127:64] = [m64]; store: [m64] = src[127:64]SSE and MMX data movement
m64, xmm0F 17 /r
movlhpsxmm, xmm0F 16 /rCopy of the low half of the source xmm to the high halfdst[127:64] = src[63:0]SSE and MMX data movement
movlpdxmm, m6466 0F 12 /rCopy of 1 double to (or from) the low half of xmmload: dst[63:0] = [m64]; store: [m64] = src[63:0]SSE and MMX data movement
m64, xmm66 0F 13 /r
movlpsxmm, m640F 12 /rCopy of 2 singles to (or from) the low half of xmmload: dst[63:0] = [m64]; store: [m64] = src[63:0]SSE and MMX data movement
m64, xmm0F 13 /r
movmskpdr32, xmm66 0F 50 /rGathering of the sign bits of 2 doubles into a registerdst = sign bits of the 2 doubles of src (2 bits)SSE and MMX data movement
movmskpsr32, xmm0F 50 /rGathering of the sign bits of 4 singles into a registerdst = sign bits of the 4 singles of src (4 bits)SSE and MMX data movement
movntdqm128, xmm66 0F E7 /rStore of 128 bits bypassing the cache[dst] = src (past the cache)SSE and MMX data movement
movntdqaxmm, xmm/m12866 0F 38 2A /rLoad of 128 bits from write-combining memorydst = [src] (from write-combining memory)SSE and MMX data movement
movntim, r320F C3 /rStore bypassing the cache (non-temporal)[dst] = src (past the cache)Data transfer
movntpdm128, xmm66 0F 2B /rStore of 128 bits bypassing the cache[dst] = src (past the cache)SSE and MMX data movement
movntpsm128, xmm0F 2B /rStore of 128 bits bypassing the cache[dst] = src (past the cache)SSE and MMX data movement
movntqm64, mm0F E7 /rStore of 64 bits (mm) bypassing the cache[dst] = src (past the cache)SSE and MMX data movement
movqmm, mm/m640F 6F /rCopy of 64 bits (also between an integer register and xmm/mm)dst = src (64 bits; into xmm the upper half becomes 0)SSE and MMX data movement
xmm, xmm/m64F3 0F 7E /r
mm/m64, mm0F 7F /r
xmm/m64, xmm66 0F D6 /r
movq2dqxmm, mmF3 0F D6 /rCopy of mm to the low half of xmmdst = (0, src) (mm to xmm)SSE and MMX data movement
movsbA4Copy of one element from [esi] to [edi], esi and edi advance[edi] = [esi]; esi = esi +/- size; edi = edi +/- size (+ if DF = 0, - if DF = 1); with rep: repeat ecx timesStrings
movsdA5Copy of one double float (with xmm; without operands: string instruction)dst[63:0] = src[63:0] (from memory: the rest of dst becomes 0); without operands it is the string instructionSSE and MMX data movement
xmm, xmm/m64F2 0F 10 /r
xmm/m64, xmmF2 0F 11 /r
movshdupxmm, xmm/m128F3 0F 16 /rDuplication of the odd singlesdst = (src[63:32], src[63:32], src[127:96], src[127:96])SSE and MMX data movement
movsldupxmm, xmm/m128F3 0F 12 /rDuplication of the even singlesdst = (src[31:0], src[31:0], src[95:64], src[95:64])SSE and MMX data movement
movssxmm, xmm/m32F3 0F 10 /rCopy of one single floatdst[31:0] = src[31:0] (from memory: the rest of dst becomes 0)SSE and MMX data movement
xmm/m32, xmmF3 0F 11 /r
movsw66 A5Copy of one element from [esi] to [edi], esi and edi advance[edi] = [esi]; esi = esi +/- size; edi = edi +/- size (+ if DF = 0, - if DF = 1); with rep: repeat ecx timesStrings
movsxr32, r/m80F BE /rCopy with sign extension to the larger sizedst = sext(src)Data transfer
r16, r/m866 0F BE /r
r32, r/m160F BF /r
r16, r/m1666 0F BF /r
movupdxmm, xmm/m12866 0F 10 /rCopy of 2 double floats (128 bits), any alignmentdst = src (128 bits; any alignment)SSE and MMX data movement
xmm/m128, xmm66 0F 11 /r
movupsxmm, xmm/m1280F 10 /rCopy of 4 single floats (128 bits), any alignmentdst = src (128 bits; any alignment)SSE and MMX data movement
xmm/m128, xmm0F 11 /r
movzxr32, r/m80F B6 /rCopy with zero extension to the larger sizedst = zext(src)Data transfer
r16, r/m866 0F B6 /r
r32, r/m160F B7 /r
r16, r/m1666 0F B7 /r
mpsadbwxmm, xmm/m128, imm866 0F 3A 42 /r ibSums of absolute byte differences (motion search)dst[i] = sums of absolute byte differences of blocks chosen by imm8SSE and MMX integers
mulal, r/m8F6 /4Unsigned multiplication, the result is twice as wide (edx:eax)edx:eax = eax * src (8 bit: ax = al * src; 16: dx:ax; 32: edx:eax)Flags: OF CF · undefined: SF ZF AF PFArithmetic
eax, r/m32F7 /4
ax, r/m1666 F7 /4
mulpdxmm, xmm/m12866 0F 59 /rMultiplication of 2 doublesfor every element: dst[i] = dst[i] * src[i] (double)SSE floating point
mulpsxmm, xmm/m1280F 59 /rMultiplication of 4 singlesfor every element: dst[i] = dst[i] * src[i] (single)SSE floating point
mulsdxmm, xmm/m64F2 0F 59 /rMultiplication of one doubledst[0] = dst[0] * src[0] (double); the other elements staySSE floating point
mulssxmm, xmm/m32F3 0F 59 /rMultiplication of one singledst[0] = dst[0] * src[0] (single); the other elements staySSE floating point
mwait0F 01 C9Wait for a change of the monitored addresswait until the watched address is written or an interrupt comesSystem and privileged
mwaitx0F 01 FBWait for a change of the monitored addresswait until the watched address is written or an interrupt comesSystem and privileged
negr/m8F6 /3Negation (two's complement)dst = 0 - dst; CF = (dst != 0)Flags: OF SF ZF AF CF PFArithmetic
r/m32F7 /3
r/m1666 F7 /3
nop90No operationno operationBarriers and others
r/m320F 19 /r
r/m1666 0F 19 /r
r/m320F 1A /r
r/m1666 0F 1A /r
r/m320F 1B /r
r/m1666 0F 1B /r
r/m320F 1C /r
r/m1666 0F 1C /r
r/m320F 1D /r
r/m1666 0F 1D /r
r/m320F 1E /r
r/m1666 0F 1E /r
r32F3 0F 1E /0
r32F3 0F 1E /2
r32F3 0F 1E /3
r32F3 0F 1E /4
r32F3 0F 1E /5
r32F3 0F 1E /6
eaxF3 0F 1E F8
ebpF3 0F 1E FD
ecxF3 0F 1E F9
ediF3 0F 1E FF
esiF3 0F 1E FE
espF3 0F 1E FC
r/m320F 1F /r
r/m1666 0F 1F /r
notr/m8F6 /2Inversion of all bits (one's complement)dst = ~dstLogic and bits
r/m32F7 /2
r/m1666 F7 /2
orr/m8, r808 /rBitwise ORdst = dst OR src; CF = OF = 0Flags: OF SF ZF CF PF · undefined: AFLogic and bits
r/m32, r3209 /r
r/m16, r1666 09 /r
r8, r/m80A /r
r32, r/m320B /r
r16, r/m1666 0B /r
al, imm80C ib
eax, imm320D id
ax, imm1666 0D iw
r/m8, imm880 /1 ib
r/m32, imm3281 /1 id
r/m16, imm1666 81 /1 iw
r/m8, imm882 /1 ib
r/m32, imm883 /1 ib
r/m16, imm866 83 /1 ib
orpdxmm, xmm/m12866 0F 56 /rBitwise ORdst = dst OR srcSSE floating point
orpsxmm, xmm/m1280F 56 /rBitwise ORdst = dst OR srcSSE floating point
outimm8, alE6 ibWrite of a value to an I/O portport[dst] = srcData transfer
imm8, eaxE7 ib
imm8, ax66 E7 ib
dx, alEE
dx, eaxEF
dx, ax66 EF
outsb6EWrite of [esi] to a port, esi advancesport[dx] = [esi]; esi = esi +/- sizeStrings
outsd6FWrite of [esi] to a port, esi advancesport[dx] = [esi]; esi = esi +/- sizeStrings
outsw66 6FWrite of [esi] to a port, esi advancesport[dx] = [esi]; esi = esi +/- sizeStrings
pabsbmm, mm/m640F 38 1C /rAbsolute value of bytesfor every 8 bit element: dst[i] = abs(src[i])SSE and MMX integers
xmm, xmm/m12866 0F 38 1C /r
pabsdmm, mm/m640F 38 1E /rAbsolute value of 32-bit elementsfor every 32 bit element: dst[i] = abs(src[i])SSE and MMX integers
xmm, xmm/m6466 0F 38 1E /r
pabswmm, mm/m640F 38 1D /rAbsolute value of 16-bit elementsfor every 16 bit element: dst[i] = abs(src[i])SSE and MMX integers
xmm, xmm/m12866 0F 38 1D /r
packssdwmm, mm/m640F 6B /rPacking of 32 to 16 bit signed (saturating)dst = (sat16_s(dst[i]) ..., sat16_s(src[i]) ...) (32 to 16 bit, signed)SSE and MMX integers
xmm, xmm/m12866 0F 6B /r
packsswbmm, mm/m640F 63 /rPacking of 16 to 8 bit signed (saturating)dst = (sat8_s(dst[i]) ..., sat8_s(src[i]) ...) (16 to 8 bit, signed)SSE and MMX integers
xmm, xmm/m12866 0F 63 /r
packusdwxmm, xmm/m12866 0F 38 2B /rPacking of 32 to 16 bit unsigned (saturating)dst = (sat16_u(dst[i]) ..., sat16_u(src[i]) ...) (32 to 16 bit, unsigned)SSE and MMX integers
packuswbmm, mm/m640F 67 /rPacking of 16 to 8 bit unsigned (saturating)dst = (sat8_u(dst[i]) ..., sat8_u(src[i]) ...) (16 to 8 bit, unsigned)SSE and MMX integers
xmm, xmm/m12866 0F 67 /r
paddbmm, mm/m640F FC /rAddition of bytesfor every 8 bit element: dst[i] = dst[i] + src[i]SSE and MMX integers
xmm, xmm/m12866 0F FC /r
padddmm, mm/m640F FE /rAddition of 32-bit elementsfor every 32 bit element: dst[i] = dst[i] + src[i]SSE and MMX integers
xmm, xmm/m12866 0F FE /r
paddqmm, mm/m640F D4 /rAddition of 64-bit elementsfor every 64 bit element: dst[i] = dst[i] + src[i]SSE and MMX integers
xmm, xmm/m12866 0F D4 /r
paddsbmm, mm/m640F EC /rAddition of bytes (signed, saturating)for every 8 bit element: dst[i] = sat_s(dst[i] + src[i])SSE and MMX integers
xmm, xmm/m12866 0F EC /r
paddswmm, mm/m640F ED /rAddition of 16-bit elements (signed, saturating)for every 16 bit element: dst[i] = sat_s(dst[i] + src[i])SSE and MMX integers
xmm, xmm/m12866 0F ED /r
paddusbmm, mm/m640F DC /rAddition of bytes (unsigned, saturating)for every 8 bit element: dst[i] = sat_u(dst[i] + src[i])SSE and MMX integers
xmm, xmm/m12866 0F DC /r
padduswmm, mm/m640F DD /rAddition of 16-bit elements (unsigned, saturating)for every 16 bit element: dst[i] = sat_u(dst[i] + src[i])SSE and MMX integers
xmm, xmm/m12866 0F DD /r
paddwmm, mm/m640F FD /rAddition of 16-bit elementsfor every 16 bit element: dst[i] = dst[i] + src[i]SSE and MMX integers
xmm, xmm/m12866 0F FD /r
palignrmm, mm/m64, imm80F 3A 0F /r ibConcatenation of two registers and shift by a number of bytesdst = low part of (dst:src >> (imm8 * 8 bits))SSE and MMX integers
xmm, xmm/m128, imm866 0F 3A 0F /r ib
pandmm, mm/m640F DB /rBitwise ANDdst = dst & srcSSE and MMX integers
xmm, xmm/m12866 0F DB /r
pandnmm, mm/m640F DF /rBitwise: NOT destination AND sourcedst = ~dst & srcSSE and MMX integers
xmm, xmm/m12866 0F DF /r
pauseF3 90Hint in spin loops (saves power, helps hyper-threading)hint: this is a wait loop (no change)Barriers and others
pavgbmm, mm/m640F E0 /rAverage of bytes (rounded)dst[i] = (dst[i] + src[i] + 1) >> 1 (unsigned)SSE and MMX integers
xmm, xmm/m12866 0F E0 /r
pavgwmm, mm/m640F E3 /rAverage of 16-bit elements (rounded)dst[i] = (dst[i] + src[i] + 1) >> 1 (unsigned)SSE and MMX integers
xmm, xmm/m12866 0F E3 /r
pblendvbxmm, xmm/m128, xmm066 0F 38 10 /rSelection of bytes by the sign bits of xmm0for every element: dst[i] = (sign bit of xmm0[i]) ? src[i] : dst[i]SSE and MMX integers
pblendwxmm, xmm/m128, imm866 0F 3A 0E /r ibSelection of 16-bit elements by a maskfor every element: dst[i] = bit i of imm8 ? src[i] : dst[i]SSE and MMX integers
pclmulqdqxmm, xmm/m128, imm866 0F 3A 44 /r ibCarry-less multiplication (Galois field, for CRC and GCM)dst = carry-less product of one quadword of dst and one of src (chosen by imm8)Cryptography
pcmpeqbmm, mm/m640F 74 /rComparison for equal (bytes), the result is a maskfor every 8 bit element: dst[i] = (dst[i] == src[i]) ? all 1 bits : 0SSE and MMX integers
xmm, xmm/m12866 0F 74 /r
pcmpeqdmm, mm/m640F 76 /rComparison for equal (32-bit elements), the result is a maskfor every 32 bit element: dst[i] = (dst[i] == src[i]) ? all 1 bits : 0SSE and MMX integers
xmm, xmm/m12866 0F 76 /r
pcmpeqqxmm, xmm/m12866 0F 38 29 /rComparison for equal (64-bit elements), the result is a maskfor every 64 bit element: dst[i] = (dst[i] == src[i]) ? all 1 bits : 0SSE and MMX integers
pcmpeqwmm, mm/m640F 75 /rComparison for equal (16-bit elements), the result is a maskfor every 16 bit element: dst[i] = (dst[i] == src[i]) ? all 1 bits : 0SSE and MMX integers
xmm, xmm/m12866 0F 75 /r
pcmpestrixmm, xmm/m128, imm866 0F 3A 61 /r ibComparison of strings (explicit lengths), the result is an indexECX = index of the match of the strings dst, src (lengths in eax, edx; mode imm8)Flags: OF SF ZF AF CF PFSSE and MMX integers
pcmpestrmxmm, xmm/m128, imm866 0F 3A 60 /r ibComparison of strings (explicit lengths), the result is a maskxmm0 = mask of the matches of the strings dst, src (lengths in eax, edx; mode imm8)Flags: OF SF ZF AF CF PFSSE and MMX integers
pcmpgtbmm, mm/m640F 64 /rComparison for greater, signed (bytes), the result is a maskfor every 8 bit element: dst[i] = (dst[i] > src[i]) ? all 1 bits : 0 (signed)SSE and MMX integers
xmm, xmm/m12866 0F 64 /r
pcmpgtdmm, mm/m640F 66 /rComparison for greater, signed (32-bit elements), the result is a maskfor every 32 bit element: dst[i] = (dst[i] > src[i]) ? all 1 bits : 0 (signed)SSE and MMX integers
xmm, xmm/m12866 0F 66 /r
pcmpgtqxmm, xmm/m12866 0F 38 37 /rComparison for greater, signed (64-bit elements), the result is a maskfor every 64 bit element: dst[i] = (dst[i] > src[i]) ? all 1 bits : 0 (signed)SSE and MMX integers
pcmpgtwmm, mm/m640F 65 /rComparison for greater, signed (16-bit elements), the result is a maskfor every 16 bit element: dst[i] = (dst[i] > src[i]) ? all 1 bits : 0 (signed)SSE and MMX integers
xmm, xmm/m12866 0F 65 /r
pcmpistrixmm, xmm/m128, imm866 0F 3A 63 /r ibComparison of strings (0 terminated), the result is an indexECX = index of the match of the 0-terminated strings dst, src (mode imm8)Flags: OF SF ZF AF CF PFSSE and MMX integers
pcmpistrmxmm, xmm/m128, imm866 0F 3A 62 /r ibComparison of strings (0 terminated), the result is a maskxmm0 = mask of the matches of the 0-terminated strings dst, src (mode imm8)Flags: OF SF ZF AF CF PFSSE and MMX integers
pextrbr32/m8, xmm, imm866 0F 3A 14 /r ibExtraction of an element from xmm into a registerdst = element number imm8 of srcSSE and MMX data movement
pextrdr/m32, xmm, imm866 0F 3A 16 /r ibExtraction of an element from xmm into a registerdst = element number imm8 of srcSSE and MMX data movement
pextrwr32, mm, imm80F C5 /r ibExtraction of an element from xmm into a registerdst = element number imm8 of srcSSE and MMX data movement
r32, xmm, imm866 0F C5 /r ib
r32/m16, xmm, imm866 0F 3A 15 /r ib
phadddmm, mm/m640F 38 02 /rAddition of adjacent 32-bit elements (horizontal)dst = (dst[0] + dst[1], dst[2] + dst[3], ..., src[0] + src[1], ...)SSE and MMX integers
xmm, xmm/m12866 0F 38 02 /r
phaddswmm, mm/m640F 38 03 /rAddition of adjacent 16-bit elements (horizontal), saturatingdst = (dst[0] + dst[1], dst[2] + dst[3], ..., src[0] + src[1], ...) (saturating)SSE and MMX integers
xmm, xmm/m12866 0F 38 03 /r
phaddwmm, mm/m640F 38 01 /rAddition of adjacent 16-bit elements (horizontal)dst = (dst[0] + dst[1], dst[2] + dst[3], ..., src[0] + src[1], ...)SSE and MMX integers
xmm, xmm/m12866 0F 38 01 /r
phminposuwxmm, xmm/m12866 0F 38 41 /rSearch for the smallest 16-bit element and its positiondst = (smallest unsigned word of src, its index, 0 ...)SSE and MMX integers
phsubdmm, mm/m640F 38 06 /rSubtraction of adjacent 32-bit elements (horizontal)dst = (dst[0] - dst[1], dst[2] - dst[3], ..., src[0] - src[1], ...)SSE and MMX integers
xmm, xmm/m12866 0F 38 06 /r
phsubswmm, mm/m640F 38 07 /rSubtraction of adjacent 16-bit elements (horizontal), saturatingdst = (dst[0] - dst[1], dst[2] - dst[3], ..., src[0] - src[1], ...) (saturating)SSE and MMX integers
xmm, xmm/m12866 0F 38 07 /r
phsubwmm, mm/m640F 38 05 /rSubtraction of adjacent 16-bit elements (horizontal)dst = (dst[0] - dst[1], dst[2] - dst[3], ..., src[0] - src[1], ...)SSE and MMX integers
xmm, xmm/m12866 0F 38 05 /r
pinsrbxmm, r32/m8, imm866 0F 3A 20 /r ibInsertion of an element from a register into xmmdst = dst with element number imm8 replaced by srcSSE and MMX data movement
pinsrdxmm, r/m32, imm866 0F 3A 22 /r ibInsertion of an element from a register into xmmdst = dst with element number imm8 replaced by srcSSE and MMX data movement
pinsrwmm, r32/m16, imm80F C4 /r ibInsertion of an element from a register into xmmdst = dst with element number imm8 replaced by srcSSE and MMX data movement
xmm, r32/m16, imm866 0F C4 /r ib
pmaddubswmm, mm/m640F 38 04 /rMultiplication of byte pairs and addition (saturating)dst[i] = sat16(dst_u8[2i] * src_s8[2i] + dst_u8[2i+1] * src_s8[2i+1])SSE and MMX integers
xmm, xmm/m12866 0F 38 04 /r
pmaddwdmm, mm/m640F F5 /rMultiplication of 16-bit pairs and addition to 32 bitdst[i] = dst_s16[2i] * src_s16[2i] + dst_s16[2i+1] * src_s16[2i+1] (32 bit)SSE and MMX integers
xmm, xmm/m12866 0F F5 /r
pmaxsbxmm, xmm/m12866 0F 38 3C /rMaximum of bytes (signed)for every 8 bit element: dst[i] = max(dst[i], src[i]) (signed)SSE and MMX integers
pmaxsdxmm, xmm/m6466 0F 38 3D /rMaximum of 32-bit elements (signed)for every 32 bit element: dst[i] = max(dst[i], src[i]) (signed)SSE and MMX integers
pmaxswmm, mm/m640F EE /rMaximum of 16-bit elements (signed)for every 16 bit element: dst[i] = max(dst[i], src[i]) (signed)SSE and MMX integers
xmm, xmm/m12866 0F EE /r
pmaxubmm, mm/m640F DE /rMaximum of bytes (unsigned)for every 8 bit element: dst[i] = max(dst[i], src[i]) (unsigned)SSE and MMX integers
xmm, xmm/m12866 0F DE /r
pmaxudxmm, xmm/m12866 0F 38 3F /rMaximum of 32-bit elements (unsigned)for every 32 bit element: dst[i] = max(dst[i], src[i]) (unsigned)SSE and MMX integers
pmaxuwxmm, xmm/m12866 0F 38 3E /rMaximum of 16-bit elements (unsigned)for every 16 bit element: dst[i] = max(dst[i], src[i]) (unsigned)SSE and MMX integers
pminsbxmm, xmm/m12866 0F 38 38 /rMinimum of bytes (signed)for every 8 bit element: dst[i] = min(dst[i], src[i]) (signed)SSE and MMX integers
pminsdxmm, xmm/m6466 0F 38 39 /rMinimum of 32-bit elements (signed)for every 32 bit element: dst[i] = min(dst[i], src[i]) (signed)SSE and MMX integers
pminswmm, mm/m640F EA /rMinimum of 16-bit elements (signed)for every 16 bit element: dst[i] = min(dst[i], src[i]) (signed)SSE and MMX integers
xmm, xmm/m12866 0F EA /r
pminubmm, mm/m640F DA /rMinimum of bytes (unsigned)for every 8 bit element: dst[i] = min(dst[i], src[i]) (unsigned)SSE and MMX integers
xmm, xmm/m12866 0F DA /r
pminudxmm, xmm/m12866 0F 38 3B /rMinimum of 32-bit elements (unsigned)for every 32 bit element: dst[i] = min(dst[i], src[i]) (unsigned)SSE and MMX integers
pminuwxmm, xmm/m12866 0F 38 3A /rMinimum of 16-bit elements (unsigned)for every 16 bit element: dst[i] = min(dst[i], src[i]) (unsigned)SSE and MMX integers
pmovmskbr32, mm0F D7 /rGathering of the sign bits of the bytes into a registerdst = the top bits of all bytes of srcSSE and MMX data movement
r32, xmm66 0F D7 /r
pmovsxbdxmm, xmm/m3266 0F 38 21 /rExtension of bytes to 32 bit (sign-extending)for every element: dst[i] = sext(src[i]) to the wider sizeSSE and MMX integers
pmovsxbqxmm, xmm/m1666 0F 38 22 /rExtension of bytes to 64 bit (sign-extending)for every element: dst[i] = sext(src[i]) to the wider sizeSSE and MMX integers
pmovsxbwxmm, xmm/m6466 0F 38 20 /rExtension of bytes to 16 bit (sign-extending)for every element: dst[i] = sext(src[i]) to the wider sizeSSE and MMX integers
pmovsxdqxmm, xmm/m6466 0F 38 25 /rExtension of 32-bit elements to 64 bit (sign-extending)for every element: dst[i] = sext(src[i]) to the wider sizeSSE and MMX integers
pmovsxwdxmm, xmm/m6466 0F 38 23 /rExtension of 16-bit elements to 32 bit (sign-extending)for every element: dst[i] = sext(src[i]) to the wider sizeSSE and MMX integers
pmovsxwqxmm, xmm/m3266 0F 38 24 /rExtension of 16-bit elements to 64 bit (sign-extending)for every element: dst[i] = sext(src[i]) to the wider sizeSSE and MMX integers
pmovzxbdxmm, xmm/m3266 0F 38 31 /rExtension of bytes to 32 bit (zero-extending)for every element: dst[i] = zext(src[i]) to the wider sizeSSE and MMX integers
pmovzxbqxmm, xmm/m1666 0F 38 32 /rExtension of bytes to 64 bit (zero-extending)for every element: dst[i] = zext(src[i]) to the wider sizeSSE and MMX integers
pmovzxbwxmm, xmm/m6466 0F 38 30 /rExtension of bytes to 16 bit (zero-extending)for every element: dst[i] = zext(src[i]) to the wider sizeSSE and MMX integers
pmovzxdqxmm, xmm/m6466 0F 38 35 /rExtension of 32-bit elements to 64 bit (zero-extending)for every element: dst[i] = zext(src[i]) to the wider sizeSSE and MMX integers
pmovzxwdxmm, xmm/m6466 0F 38 33 /rExtension of 16-bit elements to 32 bit (zero-extending)for every element: dst[i] = zext(src[i]) to the wider sizeSSE and MMX integers
pmovzxwqxmm, xmm/m3266 0F 38 34 /rExtension of 16-bit elements to 64 bit (zero-extending)for every element: dst[i] = zext(src[i]) to the wider sizeSSE and MMX integers
pmuldqxmm, xmm/m12866 0F 38 28 /rMultiplication of signed 32 bit to 64 bitdst[i] = dst_s32[2i] * src_s32[2i] (64 bit results)SSE and MMX integers
pmulhrswmm, mm/m640F 38 0B /rMultiplication of signed 16 bit, roundeddst[i] = (dst[i] * src[i] >> 14 + 1) >> 1 (signed 16 bit, rounded)SSE and MMX integers
xmm, xmm/m12866 0F 38 0B /r
pmulhuwmm, mm/m640F E4 /rMultiplication of unsigned 16 bit, the high half is keptdst[i] = (dst[i] * src[i]) >> 16 (unsigned 16 bit)SSE and MMX integers
xmm, xmm/m12866 0F E4 /r
pmulhwmm, mm/m640F E5 /rMultiplication of signed 16 bit, the high half is keptdst[i] = (dst[i] * src[i]) >> 16 (signed 16 bit)SSE and MMX integers
xmm, xmm/m12866 0F E5 /r
pmulldxmm, xmm/m12866 0F 38 40 /rMultiplication of 32 bit, the low half is keptdst[i] = low 32 bits of dst[i] * src[i]SSE and MMX integers
pmullwmm, mm/m640F D5 /rMultiplication of 16 bit, the low half is keptdst[i] = low 16 bits of dst[i] * src[i]SSE and MMX integers
xmm, xmm/m12866 0F D5 /r
pmuludqmm, mm/m640F F4 /rMultiplication of unsigned 32 bit to 64 bitdst[i] = dst_u32[2i] * src_u32[2i] (64 bit results)SSE and MMX integers
xmm, xmm/m12866 0F F4 /r
popes07Pop of a value from the stackdst = [esp]; esp = esp + 4 (16 bit: 2 bytes)Stack
ss17
ds1F
r3258+rd
r1666 58+rw
r/m328F /0
r/m1666 8F /0
fs0F A1
gs0F A9
popad61Pop of all 32-bit registers from the stackedi, esi, ebp = pop(); (esp is skipped); ebx, edx, ecx, eax = pop()Stack
popaw66 61Pop of all 16-bit registers from the stackdi, si, bp = pop(); (sp is skipped); bx, dx, cx, ax = pop()Stack
popcntr32, r/m32F3 0F B8 /rCount of the set bitsdst = number of 1 bits in srcFlags: OF SF ZF AF CF PFArithmetic
popfd9DPop of the flags register (32 bit) from the stackeflags = pop() (privileged bits stay)Flags: allStack
popfw66 9DPop of the flags register from the stackflags = pop() (privileged bits stay)Flags: allStack
pormm, mm/m640F EB /rBitwise ORdst = dst OR srcSSE and MMX integers
xmm, xmm/m12866 0F EB /r
prefetchm0F 0D /0Prefetch of a cache line (w: for writing)load the cache line of [m] into the cache (a hint, no change of the program)System and privileged
m0F 0D /2
m0F 0D /3
m0F 0D /4
m0F 0D /5
m0F 0D /6
m0F 0D /7
prefetchntam0F 18 /0Prefetch, trying not to pollute the cacheload the cache line of [m] into the cache (a hint, no change of the program)System and privileged
prefetcht0m0F 18 /1Prefetch into all cache levelsload the cache line of [m] into the cache (a hint, no change of the program)System and privileged
prefetcht1m0F 18 /2Prefetch into cache level 2 and higherload the cache line of [m] into the cache (a hint, no change of the program)System and privileged
prefetcht2m0F 18 /3Prefetch into cache level 3load the cache line of [m] into the cache (a hint, no change of the program)System and privileged
prefetchwm0F 0D /1Prefetch of a cache line (w: for writing)load the cache line of [m] into the cache (a hint, no change of the program)System and privileged
psadbwmm, mm/m640F F6 /rSum of absolute byte differencesdst[i] = sum of abs(dst_u8[j] - src_u8[j]) over 8 bytesSSE and MMX integers
xmm, xmm/m12866 0F F6 /r
pshufbmm, mm/m640F 38 00 /rShuffle of bytes by a table in the source registerdst[i] = (src[i] has top bit 1) ? 0 : dst[src[i] & 15]SSE and MMX integers
xmm, xmm/m12866 0F 38 00 /r
pshufdxmm, xmm/m128, imm866 0F 70 /r ibShuffle of the 32-bit elements as tolddst = (src[sel0], src[sel1], src[sel2], src[sel3]); sel = bit pairs of imm8SSE and MMX integers
pshufhwxmm, xmm/m128, imm8F3 0F 70 /r ibShuffle of the upper four 16-bit elementsdst[63:0] = src[63:0]; the upper four words are chosen from src[127:64] by imm8SSE and MMX integers
pshuflwxmm, xmm/m128, imm8F2 0F 70 /r ibShuffle of the lower four 16-bit elementsdst[127:64] = src[127:64]; the lower four words are chosen from src[63:0] by imm8SSE and MMX integers
pshufwmm, mm/m64, imm80F 70 /r ibShuffle of four 16-bit elements (mm)dst = four words chosen from src by imm8 (mm)SSE and MMX integers
psignbmm, mm/m640F 38 08 /rApplication of the sign of the source to bytesfor every 8 bit element: dst[i] = src[i] < 0 ? -dst[i] : (src[i] == 0 ? 0 : dst[i])SSE and MMX integers
xmm, xmm/m12866 0F 38 08 /r
psigndmm, mm/m640F 38 0A /rApplication of the sign of the source to 32-bit elementsfor every 32 bit element: dst[i] = src[i] < 0 ? -dst[i] : (src[i] == 0 ? 0 : dst[i])SSE and MMX integers
xmm, xmm/m12866 0F 38 0A /r
psignwmm, mm/m640F 38 09 /rApplication of the sign of the source to 16-bit elementsfor every 16 bit element: dst[i] = src[i] < 0 ? -dst[i] : (src[i] == 0 ? 0 : dst[i])SSE and MMX integers
xmm, xmm/m12866 0F 38 09 /r
pslldmm, imm80F 72 /6 ibShift of 32-bit elements leftfor every 32 bit element: dst[i] = dst[i] << count (count = src or imm8)SSE and MMX integers
xmm, imm866 0F 72 /6 ib
mm, mm/m640F F2 /r
xmm, xmm/m12866 0F F2 /r
pslldqxmm, imm866 0F 73 /7 ibShift of the whole register left by bytesdst = dst << (imm8 * 8 bits) (the whole register, zeros come in)SSE and MMX integers
psllqmm, imm80F 73 /6 ibShift of 64-bit elements leftfor every 64 bit element: dst[i] = dst[i] << count (count = src or imm8)SSE and MMX integers
xmm, imm866 0F 73 /6 ib
mm, mm/m640F F3 /r
xmm, xmm/m12866 0F F3 /r
psllwmm, imm80F 71 /6 ibShift of 16-bit elements leftfor every 16 bit element: dst[i] = dst[i] << count (count = src or imm8)SSE and MMX integers
xmm, imm866 0F 71 /6 ib
mm, mm/m640F F1 /r
xmm, xmm/m12866 0F F1 /r
psradmm, imm80F 72 /4 ibShift of 32-bit elements right (arithmetic)for every 32 bit element: dst[i] = dst[i] >>s count (count = src or imm8)SSE and MMX integers
xmm, imm866 0F 72 /4 ib
mm, mm/m640F E2 /r
xmm, xmm/m12866 0F E2 /r
psrawmm, imm80F 71 /4 ibShift of 16-bit elements right (arithmetic)for every 16 bit element: dst[i] = dst[i] >>s count (count = src or imm8)SSE and MMX integers
xmm, imm866 0F 71 /4 ib
mm, mm/m640F E1 /r
xmm, xmm/m12866 0F E1 /r
psrldmm, imm80F 72 /2 ibShift of 32-bit elements right (logical)for every 32 bit element: dst[i] = dst[i] >> count (count = src or imm8)SSE and MMX integers
xmm, imm866 0F 72 /2 ib
mm, mm/m640F D2 /r
xmm, xmm/m12866 0F D2 /r
psrldqxmm, imm866 0F 73 /3 ibShift of the whole register right by bytesdst = dst >> (imm8 * 8 bits) (the whole register, zeros come in)SSE and MMX integers
psrlqmm, imm80F 73 /2 ibShift of 64-bit elements right (logical)for every 64 bit element: dst[i] = dst[i] >> count (count = src or imm8)SSE and MMX integers
xmm, imm866 0F 73 /2 ib
mm, mm/m640F D3 /r
xmm, xmm/m12866 0F D3 /r
psrlwmm, imm80F 71 /2 ibShift of 16-bit elements right (logical)for every 16 bit element: dst[i] = dst[i] >> count (count = src or imm8)SSE and MMX integers
xmm, imm866 0F 71 /2 ib
mm, mm/m640F D1 /r
xmm, xmm/m12866 0F D1 /r
psubbmm, mm/m640F F8 /rSubtraction of bytesfor every 8 bit element: dst[i] = dst[i] - src[i]SSE and MMX integers
xmm, xmm/m12866 0F F8 /r
psubdmm, mm/m640F FA /rSubtraction of 32-bit elementsfor every 32 bit element: dst[i] = dst[i] - src[i]SSE and MMX integers
xmm, xmm/m12866 0F FA /r
psubqmm, mm/m640F FB /rSubtraction of 64-bit elementsfor every 64 bit element: dst[i] = dst[i] - src[i]SSE and MMX integers
xmm, xmm/m12866 0F FB /r
psubsbmm, mm/m640F E8 /rSubtraction of bytes (signed, saturating)for every 8 bit element: dst[i] = sat_s(dst[i] - src[i])SSE and MMX integers
xmm, xmm/m12866 0F E8 /r
psubswmm, mm/m640F E9 /rSubtraction of 16-bit elements (signed, saturating)for every 16 bit element: dst[i] = sat_s(dst[i] - src[i])SSE and MMX integers
xmm, xmm/m12866 0F E9 /r
psubusbmm, mm/m640F D8 /rSubtraction of bytes (unsigned, saturating)for every 8 bit element: dst[i] = sat_u(dst[i] - src[i])SSE and MMX integers
xmm, xmm/m12866 0F D8 /r
psubuswmm, mm/m640F D9 /rSubtraction of 16-bit elements (unsigned, saturating)for every 16 bit element: dst[i] = sat_u(dst[i] - src[i])SSE and MMX integers
xmm, xmm/m12866 0F D9 /r
psubwmm, mm/m640F F9 /rSubtraction of 16-bit elementsfor every 16 bit element: dst[i] = dst[i] - src[i]SSE and MMX integers
xmm, xmm/m12866 0F F9 /r
ptestxmm, xmm/m12866 0F 38 17 /rBit test (sets ZF and CF)ZF = ((dst & src) == 0); CF = ((~dst & src) == 0); OF SF AF PF = 0Flags: OF SF ZF AF CF PFSSE and MMX integers
punpckhbwmm, mm/m640F 68 /rInterleave of the high bytes of two registersdst = (dst[0], src[0], dst[1], src[1], ...) of the high half of the elementsSSE and MMX integers
xmm, xmm/m12866 0F 68 /r
punpckhdqmm, mm/m640F 6A /rInterleave of the high 32-bit elements of two registersdst = (dst[0], src[0], dst[1], src[1], ...) of the high half of the elementsSSE and MMX integers
xmm, xmm/m12866 0F 6A /r
punpckhqdqxmm, xmm/m12866 0F 6D /rInterleave of the high 64-bit elements of two registersdst = (dst[0], src[0], dst[1], src[1], ...) of the high half of the elementsSSE and MMX integers
punpckhwdmm, mm/m640F 69 /rInterleave of the high 16-bit elements of two registersdst = (dst[0], src[0], dst[1], src[1], ...) of the high half of the elementsSSE and MMX integers
xmm, xmm/m12866 0F 69 /r
punpcklbwmm, mm/m640F 60 /rInterleave of the low bytes of two registersdst = (dst[0], src[0], dst[1], src[1], ...) of the low half of the elementsSSE and MMX integers
xmm, xmm/m12866 0F 60 /r
punpckldqmm, mm/m640F 62 /rInterleave of the low 32-bit elements of two registersdst = (dst[0], src[0], dst[1], src[1], ...) of the low half of the elementsSSE and MMX integers
xmm, xmm/m12866 0F 62 /r
punpcklqdqxmm, xmm/m12866 0F 6C /rInterleave of the low 64-bit elements of two registersdst = (dst[0], src[0], dst[1], src[1], ...) of the low half of the elementsSSE and MMX integers
punpcklwdmm, mm/m640F 61 /rInterleave of the low 16-bit elements of two registersdst = (dst[0], src[0], dst[1], src[1], ...) of the low half of the elementsSSE and MMX integers
xmm, xmm/m12866 0F 61 /r
pushes06Push of a value onto the stackesp = esp - 4; [esp] = src (16 bit: 2 bytes)Stack
cs0E
ss16
ds1E
r3250+rd
r1666 50+rw
imm3268 id
imm1666 68 iw
imm86A ib
r/m32FF /6
r/m1666 FF /6
fs0F A0
gs0F A8
pushad60Push of all 32-bit registers onto the stacktmp = esp; push(eax, ecx, edx, ebx, tmp, ebp, esi, edi)Stack
pushaw66 60Push of all 16-bit registers onto the stacktmp = sp; push(ax, cx, dx, bx, tmp, bp, si, di)Stack
pushfd9CPush of the flags register (32 bit) onto the stackpush(eflags)Stack
pushfw66 9CPush of the flags register onto the stackpush(flags)Stack
pxormm, mm/m640F EF /rBitwise exclusive OR (pxor x, x clears)dst = dst ^ srcSSE and MMX integers
xmm, xmm/m12866 0F EF /r
rclr/m8, imm8C0 /2 ibRotation to the left through the carry flagrotate_left(CF:dst, count) as one value of width + 1 bitsFlags: OF CFShift and rotate
r/m32, imm8C1 /2 ib
r/m16, imm866 C1 /2 ib
r/m8, 1D0 /2
r/m32, 1D1 /2
r/m16, 166 D1 /2
r/m8, clD2 /2
r/m32, clD3 /2
r/m16, cl66 D3 /2
rcppsxmm, xmm/m1280F 53 /rReciprocal (approximate) of 4 singlesfor every element: dst[i] = 1 / src[i] (approximate)SSE floating point
rcpssxmm, xmm/m32F3 0F 53 /rReciprocal (approximate) of one singledst[0] = 1 / src[0] (approximate); the other elements staySSE floating point
rcrr/m8, imm8C0 /3 ibRotation to the right through the carry flagrotate_right(CF:dst, count) as one value of width + 1 bitsFlags: OF CFShift and rotate
r/m32, imm8C1 /3 ib
r/m16, imm866 C1 /3 ib
r/m8, 1D0 /3
r/m32, 1D1 /3
r/m16, 166 D1 /3
r/m8, clD2 /3
r/m32, clD3 /3
r/m16, cl66 D3 /3
rdfsbaser32F3 0F AE /0Read of the base address of fs/gsdst = base address of fsSystem and privileged
rdgsbaser32F3 0F AE /1Read of the base address of fs/gsdst = base address of gsSystem and privileged
rdmsr0F 32Read of a model-specific register (privileged)edx:eax = model-specific register number ecx (privileged)System and privileged
rdpidr64F3 0F C7 /7Read of the processor iddst = id of the processorSystem and privileged
rdpmc0F 33Read of a performance counteredx:eax = performance counter number ecxSystem and privileged
rdrandr320F C7 /6Read of a random number from the processordst = random number from the processor; CF = 1 if it is validFlags: OF SF ZF AF CF PFSystem and privileged
r1666 0F C7 /6
rdseedr320F C7 /7Read of a seed for random number generatorsdst = seed value for random number generators; CF = 1 if it is validFlags: OF SF ZF AF CF PFSystem and privileged
r1666 0F C7 /7
rdsspdr32F3 0F 1E /1Read of the shadow stack pointerdst = shadow stack pointerSystem and privileged
rdtsc0F 31Read of the time stamp counter (clock cycles)edx:eax = time stamp counterSystem and privileged
rdtscp0F 01 F9Read of the time stamp counter and the processor idedx:eax = time stamp counter; ecx = processor idSystem and privileged
retimm16C2 iwReturn from the function (the address is popped)eip = pop(); with imm16: esp = esp + imm16 afterwardsJumps, calls and interrupts
C3
retfimm16CA iwReturn from a far functioneip = pop(); cs = pop()Jumps, calls and interrupts
CB
rolr/m8, imm8C0 /0 ibRotation to the leftdst = rotate_left(dst, count); CF = lowest bit of the resultFlags: OF CFShift and rotate
r/m32, imm8C1 /0 ib
r/m16, imm866 C1 /0 ib
r/m8, 1D0 /0
r/m32, 1D1 /0
r/m16, 166 D1 /0
r/m8, clD2 /0
r/m32, clD3 /0
r/m16, cl66 D3 /0
rorr/m8, imm8C0 /1 ibRotation to the rightdst = rotate_right(dst, count); CF = highest bit of the resultFlags: OF CFShift and rotate
r/m32, imm8C1 /1 ib
r/m16, imm866 C1 /1 ib
r/m8, 1D0 /1
r/m32, 1D1 /1
r/m16, 166 D1 /1
r/m8, clD2 /1
r/m32, clD3 /1
r/m16, cl66 D3 /1
roundpdxmm, xmm/m128, imm866 0F 3A 09 /r ibRounding of 2 doubles to whole numbersdst[i] = round(src[i]) with the rounding mode of imm8SSE floating point
roundpsxmm, xmm/m128, imm866 0F 3A 08 /r ibRounding of 4 singles to whole numbersdst[i] = round(src[i]) with the rounding mode of imm8SSE floating point
roundsdxmm, xmm/m64, imm866 0F 3A 0B /r ibRounding of one double to a whole numberdst[i] = round(src[i]) with the rounding mode of imm8SSE floating point
roundssxmm, xmm/m32, imm866 0F 3A 0A /r ibRounding of one single to a whole numberdst[i] = round(src[i]) with the rounding mode of imm8SSE floating point
rsm0F AALeaving of system management mode (SMM)leave system management mode, restore the saved stateFlags: allSystem and privileged
rsqrtpsxmm, xmm/m1280F 52 /rReciprocal square root (approximate) of 4 singlesfor every element: dst[i] = 1 / sqrt(src[i]) (approximate)SSE floating point
rsqrtssxmm, xmm/m32F3 0F 52 /rReciprocal square root (approximate) of one singledst[0] = 1 / sqrt(src[0]) (approximate); the other elements staySSE floating point
sahf9EStore of ah into the flagsSF ZF AF PF CF = bits of ahFlags: SF ZF AF CF PFFlags
salcD6Setting of al from CF (undocumented)al = CF ? 255 : 0Arithmetic
sarr/m8, imm8C0 /7 ibShift right signed (the sign bit stays)dst = dst >>s count (sign bit comes in); CF = last bit shifted outFlags: OF SF ZF CF PF · undefined: AFShift and rotate
r/m32, imm8C1 /7 ib
r/m16, imm866 C1 /7 ib
r/m8, 1D0 /7
r/m32, 1D1 /7
r/m16, 166 D1 /7
r/m8, clD2 /7
r/m32, clD3 /7
r/m16, cl66 D3 /7
sbbr/m8, r818 /rSubtraction with borrow (CF)dst = dst - src - CFFlags: OF SF ZF AF CF PFArithmetic
r/m32, r3219 /r
r/m16, r1666 19 /r
r8, r/m81A /r
r32, r/m321B /r
r16, r/m1666 1B /r
al, imm81C ib
eax, imm321D id
ax, imm1666 1D iw
r/m8, imm880 /3 ib
r/m32, imm3281 /3 id
r/m16, imm1666 81 /3 iw
r/m8, imm882 /3 ib
r/m32, imm883 /3 ib
r/m16, imm866 83 /3 ib
scasbAEComparison of al/ax/eax with [edi], edi advancesflags = acc - [edi]; edi = +/- size; with repe / repne: repeat, at most ecx timesFlags: OF SF ZF AF CF PFStrings
scasdAFComparison of al/ax/eax with [edi], edi advancesflags = acc - [edi]; edi = +/- size; with repe / repne: repeat, at most ecx timesFlags: OF SF ZF AF CF PFStrings
scasw66 AFComparison of al/ax/eax with [edi], edi advancesflags = acc - [edi]; edi = +/- size; with repe / repne: repeat, at most ecx timesFlags: OF SF ZF AF CF PFStrings
setar/m80F 97 /rSetting of the byte to 1 if unsigned above (CF=0 and ZF=0), else to 0dst = (CF = 0 and ZF = 0) ? 1 : 0Data transfer
setber/m80F 96 /rSetting of the byte to 1 if unsigned below or equal (CF=1 or ZF=1), else to 0dst = (CF = 1 or ZF = 1) ? 1 : 0Data transfer
setcr/m80F 92 /rSetting of the byte to 1 if carry, unsigned below (CF=1), else to 0dst = (CF = 1) ? 1 : 0Data transfer
setgr/m80F 9F /rSetting of the byte to 1 if signed greater (ZF=0 and SF=OF), else to 0dst = (ZF = 0 and SF = OF) ? 1 : 0Data transfer
setger/m80F 9D /rSetting of the byte to 1 if signed greater or equal (SF=OF), else to 0dst = (SF = OF) ? 1 : 0Data transfer
setlr/m80F 9C /rSetting of the byte to 1 if signed less (SF≠OF), else to 0dst = (SF != OF) ? 1 : 0Data transfer
setler/m80F 9E /rSetting of the byte to 1 if signed less or equal (ZF=1 or SF≠OF), else to 0dst = (ZF = 1 or SF != OF) ? 1 : 0Data transfer
setncr/m80F 93 /rSetting of the byte to 1 if no carry, unsigned above or equal (CF=0), else to 0dst = (CF = 0) ? 1 : 0Data transfer
setnor/m80F 91 /rSetting of the byte to 1 if no overflow (OF=0), else to 0dst = (OF = 0) ? 1 : 0Data transfer
setnpr/m80F 9B /rSetting of the byte to 1 if parity odd (PF=0), else to 0dst = (PF = 0) ? 1 : 0Data transfer
setnsr/m80F 99 /rSetting of the byte to 1 if not negative (SF=0), else to 0dst = (SF = 0) ? 1 : 0Data transfer
setnzr/m80F 95 /rSetting of the byte to 1 if not equal, result not zero (ZF=0), else to 0dst = (ZF = 0) ? 1 : 0Data transfer
setor/m80F 90 /rSetting of the byte to 1 if overflow (OF=1), else to 0dst = (OF = 1) ? 1 : 0Data transfer
setpr/m80F 9A /rSetting of the byte to 1 if parity even (PF=1), else to 0dst = (PF = 1) ? 1 : 0Data transfer
setsr/m80F 98 /rSetting of the byte to 1 if negative (SF=1), else to 0dst = (SF = 1) ? 1 : 0Data transfer
setzr/m80F 94 /rSetting of the byte to 1 if equal, result zero (ZF=1), else to 0dst = (ZF = 1) ? 1 : 0Data transfer
sfence0F AE /7Barrier for storesall earlier stores are done before later storesBarriers and others
sgdtm0F 01 /0Store of the global descriptor table register[m] = GDTRSystem and privileged
shlr/m8, imm8C0 /4 ibShift left (times 2 per place), filled with 0dst = dst << count (count masked to 5 / 6 bits); CF = last bit shifted outFlags: OF SF ZF CF PF · undefined: AFShift and rotate
r/m8, imm8C0 /6 ib
r/m32, imm8C1 /4 ib
r/m32, imm8C1 /6 ib
r/m16, imm866 C1 /4 ib
r/m16, imm866 C1 /6 ib
r/m8, 1D0 /4
r/m8, 1D0 /6
r/m32, 1D1 /4
r/m32, 1D1 /6
r/m16, 166 D1 /4
r/m16, 166 D1 /6
r/m8, clD2 /4
r/m8, clD2 /6
r/m32, clD3 /4
r/m32, clD3 /6
r/m16, cl66 D3 /4
r/m16, cl66 D3 /6
shldr/m32, r32, imm80F A4 /r ibShift left, filled from a second registerdst = (dst << count) OR (src >> (width - count))Flags: OF SF ZF CF PF · undefined: AFShift and rotate
r/m16, r16, imm866 0F A4 /r ib
r/m32, r32, cl0F A5 /r
r/m16, r16, cl66 0F A5 /r
shrr/m8, imm8C0 /5 ibShift right unsigned, filled with 0dst = dst >> count (zeros come in); CF = last bit shifted outFlags: OF SF ZF CF PF · undefined: AFShift and rotate
r/m32, imm8C1 /5 ib
r/m16, imm866 C1 /5 ib
r/m8, 1D0 /5
r/m32, 1D1 /5
r/m16, 166 D1 /5
r/m8, clD2 /5
r/m32, clD3 /5
r/m16, cl66 D3 /5
shrdr/m32, r32, imm80F AC /r ibShift right, filled from a second registerdst = (dst >> count) OR (src << (width - count))Flags: OF SF ZF CF PF · undefined: AFShift and rotate
r/m16, r16, imm866 0F AC /r ib
r/m32, r32, cl0F AD /r
r/m16, r16, cl66 0F AD /r
shufpdxmm, xmm/m128, imm866 0F C6 /r ibShuffle of doubles from two registers as tolddst = (dst[sel0], src[sel1]); sel = bits of imm8SSE floating point
shufpsxmm, xmm/m128, imm80F C6 /r ibShuffle of singles from two registers as tolddst = (dst[sel0], dst[sel1], src[sel2], src[sel3]); sel = bit pairs of imm8SSE floating point
sidtm0F 01 /1Store of the interrupt descriptor table register[m] = IDTRSystem and privileged
sldtr32/m160F 00 /0Store of the local descriptor table registerdst = LDTRSystem and privileged
r1666 0F 00 /0
smswm0F 01 /4Store of the machine status worddst = CR0 bits 0 to 15System and privileged
sqrtpdxmm, xmm/m12866 0F 51 /rSquare root of 2 doublesfor every element: dst[i] = sqrt(src[i])SSE floating point
sqrtpsxmm, xmm/m1280F 51 /rSquare root of 4 singlesfor every element: dst[i] = sqrt(src[i])SSE floating point
sqrtsdxmm, xmm/m64F2 0F 51 /rSquare root of one doubledst[0] = sqrt(src[0]); the other elements staySSE floating point
sqrtssxmm, xmm/m32F3 0F 51 /rSquare root of one singledst[0] = sqrt(src[0]); the other elements staySSE floating point
stac0F 01 CBSetting of the AC flag (access protection)EFLAGS.AC = 1Flags: ACFlags
stcF9Setting of the carry flagCF = 1Flags: CFFlags
stdFDSetting of the direction flag (string instructions count down)DF = 1Flags: DFFlags
stiFBEnabling of interrupts (IF=1)IF = 1 (effective after the next instruction)Flags: IFFlags
stmxcsrm0F AE /3Store of the SSE control and status register[m32] = MXCSRSSE and MMX data movement
stosbAAStore of al/ax/eax to [edi], edi advances[edi] = acc; edi = edi +/- size (acc is al, ax or eax)Strings
stosdABStore of al/ax/eax to [edi], edi advances[edi] = acc; edi = edi +/- size (acc is al, ax or eax)Strings
stosw66 ABStore of al/ax/eax to [edi], edi advances[edi] = acc; edi = edi +/- size (acc is al, ax or eax)Strings
strr32/m160F 00 /1Store of the task registerdst = task registerSystem and privileged
r1666 0F 00 /1
subr/m8, r828 /rSubtraction of the source from the destinationdst = dst - srcFlags: OF SF ZF AF CF PFArithmetic
r/m32, r3229 /r
r/m16, r1666 29 /r
r8, r/m82A /r
r32, r/m322B /r
r16, r/m1666 2B /r
al, imm82C ib
eax, imm322D id
ax, imm1666 2D iw
r/m8, imm880 /5 ib
r/m32, imm3281 /5 id
r/m16, imm1666 81 /5 iw
r/m8, imm882 /5 ib
r/m32, imm883 /5 ib
r/m16, imm866 83 /5 ib
subpdxmm, xmm/m12866 0F 5C /rSubtraction of 2 doublesfor every element: dst[i] = dst[i] - src[i] (double)SSE floating point
subpsxmm, xmm/m1280F 5C /rSubtraction of 4 singlesfor every element: dst[i] = dst[i] - src[i] (single)SSE floating point
subsdxmm, xmm/m64F2 0F 5C /rSubtraction of one doubledst[0] = dst[0] - src[0] (double); the other elements staySSE floating point
subssxmm, xmm/m32F3 0F 5C /rSubtraction of one singledst[0] = dst[0] - src[0] (single); the other elements staySSE floating point
swapgs0F 01 F8Swap of the gs base with the kernel valueswap(gs base, kernel gs base) (privileged)System and privileged
syscall0F 05Call of the operating system (64 bit, fast)ecx = eip of the next instruction; r11 = flags; eip = LSTAR; flags = flags & ~SFMASK; ring 0Flags: RFJumps, calls and interrupts
sysenter0F 34Call of the operating system (32 bit, fast)enter ring 0 at the address in IA32_SYSENTER_EIPFlags: IF VMJumps, calls and interrupts
sysexit0F 35Return from a system call (32 bit, fast)back to ring 3: eip = edx, esp = ecxJumps, calls and interrupts
sysretd0F 07Return from a system call (fast)eip = ecx; flags = r11; back to ring 3Jumps, calls and interrupts
testr/m8, r884 /rBitwise test (AND), only the flags changeflags = dst & src (the result is thrown away); CF = OF = 0Flags: OF SF ZF CF PF · undefined: AFCompare and exchange
r/m32, r3285 /r
r/m16, r1666 85 /r
al, imm8A8 ib
eax, imm32A9 id
ax, imm1666 A9 iw
r/m8, imm8F6 /0 ib
r/m8, imm8F6 /1 ib
r/m32, imm32F7 /0 id
r/m32, imm32F7 /1 id
r/m16, imm1666 F7 /0 iw
r/m16, imm1666 F7 /1 iw
tzcntr32, r/m32F3 0F BC /rCount of the trailing zero bitsdst = number of trailing 0 bits of src (width if src = 0)Flags: ZF CFArithmetic
ucomisdxmm, xmm/m6466 0F 2E /rLike comisd, no exception for quiet NaNZF PF CF = compare(dst, src): greater 0 0 0, less 0 0 1, equal 1 0 0, unordered 1 1 1; OF SF AF = 0Flags: OF SF ZF AF CF PFSSE floating point
ucomissxmm, xmm/m320F 2E /rLike comiss, no exception for quiet NaNZF PF CF = compare(dst, src): greater 0 0 0, less 0 0 1, equal 1 0 0, unordered 1 1 1; OF SF AF = 0Flags: OF SF ZF AF CF PFSSE floating point
ud20F 0BDeliberately invalid instruction (raises an exception)raises #UD (invalid instruction)Jumps, calls and interrupts
unpckhpdxmm, xmm/m12866 0F 15 /rInterleave of the high doubles of two registersdst = (dst[1], src[1])SSE floating point
unpckhpsxmm, xmm/m1280F 15 /rInterleave of the high singles of two registersdst = (dst[2], src[2], dst[3], src[3])SSE floating point
unpcklpdxmm, xmm/m12866 0F 14 /rInterleave of the low doubles of two registersdst = (dst[0], src[0])SSE floating point
unpcklpsxmm, xmm/m1280F 14 /rInterleave of the low singles of two registersdst = (dst[0], src[0], dst[1], src[1])SSE floating point
verrr/m160F 00 /4Check of a segment for readabilityZF = 1 if the segment src can be readFlags: ZFSystem and privileged
verwr/m160F 00 /5Check of a segment for writabilityZF = 1 if the segment src can be writtenFlags: ZFSystem and privileged
wbinvd0F 09Write-back and invalidation of the caches (privileged)write back and empty the caches (privileged)System and privileged
wrfsbaser32F3 0F AE /2Write of the base address of fs/gsbase address of fs = srcSystem and privileged
wrgsbaser32F3 0F AE /3Write of the base address of fs/gsbase address of gs = srcSystem and privileged
wrmsr0F 30Write of a model-specific register (privileged)model-specific register number ecx = edx:eax (privileged)System and privileged
xaddr/m8, r80F C0 /rExchange and add (atomic with lock)tmp = dst + src; src = dst; dst = tmpFlags: OF SF ZF AF CF PFCompare and exchange
r/m32, r320F C1 /r
r/m16, r1666 0F C1 /r
xchgr/m8, r886 /rExchange of the two operands (with memory: atomic)tmp = dst; dst = src; src = tmpData transfer
r/m32, r3287 /r
r/m16, r1666 87 /r
r32, eax90+rd
r16, ax66 90+rw
xgetbv0F 01 D0Read of an extended control register (XCR)edx:eax = extended control register number ecxSystem and privileged
xlatbD7Load of al from the table at [ebx + al]al = [ebx + zext(al)]Data transfer
xorr/m8, r830 /rBitwise exclusive OR (xor eax, eax sets to 0)dst = dst ^ src; CF = OF = 0Flags: OF SF ZF CF PF · undefined: AFLogic and bits
r/m32, r3231 /r
r/m16, r1666 31 /r
r8, r/m832 /r
r32, r/m3233 /r
r16, r/m1666 33 /r
al, imm834 ib
eax, imm3235 id
ax, imm1666 35 iw
r/m8, imm880 /6 ib
r/m32, imm3281 /6 id
r/m16, imm1666 81 /6 iw
r/m8, imm882 /6 ib
r/m32, imm883 /6 ib
r/m16, imm866 83 /6 ib
xorpdxmm, xmm/m12866 0F 57 /rBitwise exclusive OR (xorps x, x clears)dst = dst ^ srcSSE floating point
xorpsxmm, xmm/m1280F 57 /rBitwise exclusive OR (xorps x, x clears)dst = dst ^ srcSSE floating point
xrstorm0F AE /5Restoring of the extended processor statethe state components selected by edx:eax = [m]System and privileged
xsavem0F AE /4Saving of the extended processor state (SSE, AVX ...)[m] = the state components selected by edx:eaxSystem and privileged
xsavecm0F C7 /4Saving of the extended processor state (SSE, AVX ...)[m] = the state components selected by edx:eaxSystem and privileged
xsaveoptm0F AE /6Saving of the extended processor state (SSE, AVX ...)[m] = the state components selected by edx:eaxSystem and privileged
xsetbv0F 01 D1Write of an extended control register (XCR)extended control register number ecx = edx:eax (privileged)System and privileged