Az x86 utasításkészlet az x86-kompatibilis mikroprocesszorok által támogatott utasításkészletre utal. Az utasítások általában egy végrehajtható program részét képezik, gyakran számítógépes fájlként tárolják és a processzoron hajtják végre.
Az x86 utasításkészletet többször bővítették, szélesebb regisztereket és adattípusokat, valamint új funkciókat vezettek be.
x86 integer utasítások Alább látható az Intel teljes 8086/8088 utasításkészlete (összesen 81 utasítás). Ezek az utasítások 32 bites módban is elérhetőek, amelyben 32 bites regiszterekkel (eax, ebx stb.) és értékekkel működnek a 16 bites (ax, bx stb.) megfelelőik helyett. A frissített utasításkészlet architektúra szerint van csoportosítva (i186, i286, i386, i486, i586/i686), és (32 bites) x86 és (64 bites) x86-64 (AMD64 néven is ismert) néven szerepel.
Eredeti 8086/8088 utasítás Ez az eredeti utasításkészlet. A 'Megjegyzések' oszlopban az r a regisztert, az m a memóriacímet, az imm („immediate”) pedig az azonnalit (azaz egy értéket) jelenti.
+ Eredeti 8086/8088 utasításkészlet Uta-sítás Jelentése Megjegyzés Opcode ASCII adjust AL after addition(az AL ASCII-igazítása összeadás után) kicsomagolt (unpacked) bináris kódolású decimálissal használatos ASCII adjust AX before division(AX ASCII-igazítása osztás előtt) A 8086/8088 adatlap csak az AAD utasítás 10-es verzióját tartalmazza (opcode ), de bármely más alap működik. Később az Intel dokumentációja is általános formát kapott. A NEC V20 és V30 (és esetleg más NEC V sorozatú CPU-k) mindig az alap 10-et használják, és figyelmen kívül hagyják az érvelést, ami számos inkompatibilitást okoz. ASCII adjust AX after multiplication(AX ASCII-igazítása szorzás után) Csak a 10-es alapverzió (az operandus 0xA) van dokumentálva, lásd az AAD-re vonatkozó megjegyzéseket ASCII adjust AL after subtraction(AL ASCII-igazítása kivonás után) Add with carry(hozzáadás átvitellel) (1) r += (r/m/imm+CF); (2) m += (r/imm+CF); ..., ..., Add(hozzáadás) (1) r += r/m/imm; (2) m += r/imm; ..., ..., Logical AND(logikai ÉS) (1) r &= r/m/imm; (2) m &= r/imm; ..., ..., Call procedure(függvényhívás) (1) push IP, jmp a szegmensen belül; (2) push CS:IP, ugorjon a szegmensbe , , , Convert byte to word(bájt konvertálása szóvá) AH = (sign)AL Clear carry flag(az átvitelbitet nullára állítja) CF = 0; Clear direction flag(az irány-jelzőt nullára állítja) DF = 0; Clear interrupt flag(a megszakítás-jelzőt nullára állítja) IF = 0; Complement carry flag(az átvitel-bitet ellentetjére állítja) CF = !CF; Compare operands(az operandusok összehasonlítása) (1) r – r/m/imm; (2) m – r/imm; ..., ..., Hasonlítsa össze a bájtokat a memóriában. Használható vagy előtaggal a -szeres utasítás tesztelésére és megismétlésére. if (DF==0) *(byte*)SI++ - *(byte*)ES:DI++; else *(byte*)SI-- - *(byte*)ES:DI--; Hasonlítsa össze a szavakat. Használható vagy előtaggal a -szeres utasítás tesztelésére és megismétlésére. if (DF==0) *(word*)SI++ - *(word*)ES:DI++; else *(word*)SI-- - *(word*)ES:DI--; Szó konvertálása duplaszóvá DX = (sign)AX Decimal adjust AL after addition(az AL decimális igazítása összeadás után) (packed BCD-vel használva) Decimal adjust AL after subtraction(az AL decimális igazítása kivonás után) (packed BCD-vel használva) Decrement by 1(csökkentse 1-gyel) ..., , Unsigned divide(előjel nélküli osztás) (1) AX = DX:AX / r/m; DX = maradék (2) AL = AX / r/m;] AH = maradék , Used with ebegőpontos egységgel használható .. Enter halt state Stop állapot Előjeles osztás (1) AX = DX:AX / r/m; DX = maradék (2) AL = AX / r/m; AH = maradék , Előjeles szorzás egyoperandusos formában (1) DX:AX = AX * r/m; (2) AX = AL * r/m , Bemenet a portról (1) AL = port[imm]; (2) AL = port[DX]; (3) AX = port[imm]; (4) AX = port[DX]; , , , Increment by 1(növelje 1-gyel) ..., , Call to interrupt(megszakítás hívás) *--SP = FLAGS; *--SP = CS; *--SP = IP , Call to interrupt if overflow(megszakítás túlcsordulás esetén) if (O == 1) *--SP = FLAGS; *--SP = CS; *--SP = IP Return from interrupt(visszatérés a megszakításból) IP = *SP++, CS = *SP++, FLAGS = *SP++; Jump if condition(feltételes elágazás) . ... Jump if CX is zero(ugrás, ha CX nulla) az JECXZ ECX-hez CX helyett 32 bites módban (ugyanaz a műveleti kód). Jump(feltétel nélküli ugrás) (1) ugrás a szegmensen belül; (2) ugrás a szegmensbe ..., , Load FLAGS into AH register töltsd be a FLAGS-t az AH regiszterbe Load DS:r with far pointer(DS:r betöltése távoli mutatóval) r = m; DS = 2 + m; Load Effective Address kiszámítja az effektív operanduscímet, és betölti egy regiszterbe anélkül, hogy hozzáférne ahhoz a memóriához, amelyre hivatkozik. Load ES:r with far pointer(töltse be az ES:r-t távoli mutatóval) r = m; ES = 2 + m; Assert BUS LOCK# signal(a BUS LOCK# jel érvényesítése) (multiprocesszing) String bájt betöltése. Használható előtaggal a -szeres megismétlésére. Karakterlánc szó betöltése. Használható előtaggal a -szeres megismétlésére. / Loop control(ciklusvezérlés) () ... Move (1) r = r/m/imm; (2) m = r/imm; (3) r/m = sreg; (4) sreg = r/m; ..., , ..., ..., , Bájt áthelyezése karakterláncról karakterláncra. Használható előtaggal a -szeres megismétlésére. if (DF==0) *(byte*)ES:DI++ = *(byte*)SI++; else *(byte*)ES:DI-- = *(byte*)SI--; Szó (word) áthelyezése karakterláncról karakterláncra. Használható előtaggal a -szeres megismétlésére. if (DF==0) *(word*)ES:DI++ = *(word*)SI++; else *(word*)ES:DI-- = *(word*)SI--; Előjel nélküli szorzás (1) DX:AX = AX * r/m; (2) AX = AL * r/m; , Kettes komplemens negáció ... No operation az -nek megfelelő opkód Negálja az operandust, logikai NEM ... Logikai VAGY (1) r ∣= r/m/imm; (2) m ∣= r/imm; ..., ..., Kimenet a portra (1) port[imm] = AL; (2) port[DX] = AL; (3) port[imm] = AX; (4) port[DX] = AX; , , , Adatok regiszterbe töltése a stack-ből r/m/sreg = *SP++; , , , ..., a FLAGS regiszter feltöltése a veremből FLAGS = *SP++; Adatok beküldése a verembe , , , , ..., A FLAGS tartalmát a verembe tölti Rotate left with carry(forgatás balra, átvitellel) ... (186+), ... Rotate right with carry(forgatás jobbra, átvitellel) ... (186+), ... Ismételje meg a MOVS/STOS/CMPS/LODS/SCAS parancsot () , Visszatérés az eljárásból Nem igazi utasítás. Az assembler ezeket RETN-re vagy RETF-re fordítja a célrendszer memóriamodelljétől függően. Return from near procedure visszatérés a közeli eljárásból , Return from far procedure visszatérés a távoli eljárásból , Rotate left(forgatás balra) ... (186+), ... Rotate right(forgatás jobbra) ... (186+), ... Store AH into FLAGS(Töltse az akkumulátor magasabb helyiértékű bájtát a FLAGS regiszterbe Arithmetikai eltolás balra (előjeles eltolás balra, signed shift left) (1) r/m <<= 1; (2) r/m <<= CL; ... (186+), ... Arithmetikai eltolás jobbra (előjeles eltolás jobbra, signed shift right) (1) (signed) r/m >>= 1; (2) (signed) r/m >>= CL; ... (186+), ... Subtraction with borrow(Kivonás kölcsönnel) (1) r -= (r/m/imm+CF); (2) m -= (r/imm+CF); az alternatív 1 bájtos kódolása elérhető a nem dokumentált SALC utasításon keresztül ..., ..., Hasonlítsa össze a bájtkarakterláncot. Használható vagy előtaggal a -szeres utasítás tesztelésére és megismétlésére. Compare word string. May be used with a or prefix to test and repeat the instruction times. Shift left (előjel nélküli eltolás balra, unsigned shift left) Ugyanaz a műveleti kód, mint a SAL, mivel a logikai balra eltolás egyenlő az aritmetikai balra tolással. ... (186+), ... Shift right (előjel nélküli eltolás jobbra, unsigned shift right) ... (186+), ... Set carry flag CF = 1; Set direction flag DF = 1; Set interrupt flag IF = 1; Tárolja a bájtot karakterláncban. Használható előtaggal a -szeres megismétlésére. Tárolja a szót karakterláncban. May be used with a prefix to repeat the instruction times. Subtraction(kivonás) (1) r -= r/m/imm; (2) m -= r/imm; ..., ..., Logikai összehasonlítás (AND) (1) r & r/m/imm; (2) m & r/imm; , , , , , Wait until not busy(Várja meg, amíg nem lesz elfoglalva) Megvárja, amíg a BUSY# pin inaktív lesz (lebegőpontos egységgel használják) Exchange data(Adatcsere) A spinlock általában atomi műveletként használja az xchg-t. (coma bug). , , ... Table look-up translation(Táblázat keresési fordítás) úgy viselkedik, mint a Exclusive OR(Kizáró VAGY) (1) r ^+= r/m/imm; (2) m ^= r/imm; ..., ...,
Hozzáadva további processzorokhoz Hozzáadva az 80186/80188 processzorral Új utasítások az Intel 80186 és 80188 processzoroknál. Az NEC V20/V30 processzorokban és utódaikban is jelen vanak.
Utasítás mnemonik Opkód Utasítás leírása Ring PUSHA 60 Az összes általános célú regisztert a veremregiszterek közé helyezi. Az AX,CX,DX,BX,SP,BP,SI,DI regiszterek sorrendjét a veremregiszterek közé helyezi. Az SP értéke, amely a PUSHA utasítás előtti kezdeti SP értékkel egyezik meg. rowspan=3 POPA 61 Az összes általános célú regiszter eltávolítása a veremből. A regiszterek a PUSHAfordított sorrendjében kerülnek át a veremből a regiszterekbe (az SP regiszternek megfelelő kivett elem kerül át, de nem kerül be egyetlen regiszterbe sem). BOUND reg,m16&16 Olvasson be egy előjeles tömbhatár-párt a memóriából, majd ellenőrizze, hogy a regiszterargumentum nincs-e sem az első korlát alatt, sem a második korlát felett. Ha bármelyik teszt sikertelen, akkor egy „bounds range-exceeded” kivétel (#BR, interrupt vector 5) keletkezik. PUSH imm 68 iw Egy szó (vagy szóra kiterjesztett bájtjel) értéket helyez a veremre. Példák: PUSH 12h ; encoded as 6Ah 12h PUSH 1234h ; encoded as 68h 34h 12h rowspan=4 6A ib IMUL reg,r/m,imm, Nem kiszélesedő, 3 argumentumos egészértékű szó, szorzás azonnali operátorral. Példa: IMUL CX, DX, 12h IMUL BX, SI, 1200h IMUL DI, word ptr [BX+SI], 12h IMUL SI, word ptr [BP-4], 1200h Note that since the lower half is the same for unsigned and signed multiplication, this version of the instruction can be used for both. INSB 6C 8 bites bemenet az I/O portról a karakterláncba. A művelet egyenértékű a következővel: IN AL, DX STOSB ; a DI beállítása operandusméret szerint rowspan=4 INSW 6D 16 bites bemenet az I/O portról a karakterláncra. OUTSB 6E 8 bites kimenet karakterláncból I/O portra. A működés egyenértékű a következővel: LODSB ; az SI beállítása az operandus méretének és a DF-nek megfelelően OUT DX, AL OUTSW 6F 16 bites kimenet a karakterláncból az I/O portra. ROL r/m, imm8 C0 /0 ib Rotate left immediate(balra forgatás) rowspan=8 ROR r/m, imm8 C0 /1 ib,C1 /1 ib Rotate right immediate(jobbra forgatás) RCL r/m, imm8 C0 /2 ib,C1 /2 ib Rotate left through carry with immediate rotate-amountbalra forgatás átvitellel RCR r/m, imm8 C0 /3 ib,C1 /3 ib Rotate right through carry with immediate rotate-amountjobbra forgatás átvitellel SHL r/m, imm8 C0 /4 ib,C1 /4 ib Shift left immediateeltolás balra SHR r/m, imm8 C0 /5 ib,C1 /5 ib Unsigned shift right immediateelőjel nélküli eltolás jobbra SAR r/m, imm8 C0 /7 ib,C1 /7 ib Signed shift right immediateelőjeles eltolás jobbra Eljárás veremkeret létrehozása. Az első operandus meghatározza az utasítás által lefoglalandó veremkeret méretét, a második operandus pedig a beágyazási szintet (a korábbi veremkeret-mutatók számát, amelyeket a CPU-nak át kell másolnia a veremmutató beállítása előtt). Az ENTER arg1,arg2 művelete a következő: PUSH rBP temp1 := rSP if( arg2 > 0 ) { for( i = 1; i<arg2; i++ ) { temp2 := read_mem[SS:rBP-i*OperandSize] PUSH temp2
PUSH rBP } rSP := rSP - arg1 ; allocate stack - updates SP/ESP/RSP based on StackAddressSize rBP := temp1 ; set frame pointer - updates BP/EBP/RBP based on OperandSize rowspan=2 LEAVE C9 Az előző ENTER utasítás által létrehozott eljárásverem feloldása. A művelet egyenértékű a következővel: MOV rSP,rBP ; release stack - frissíti az SP/ESP/RSP-t a StackAddressSize alapján