IA -32 ( Intel Architecture 32 bit ) , noen ganger i386 , definerer arkitekturen eller instruksjonssettet til mikroprosessorer produsert av Intel , AMD og andre mindre selskaper for skrivebordsmarkedet siden 1985 , og som er tilstede i de aller fleste personlige datamaskiner i verden. Det blir ofte referert til som en CISC- arkitektur , men disse distinksjonene mister stadig mer mening etter hvert som teknologien skrider frem.
Begrepet ble laget for å skille instruksjonssettet for prosessorer som er kompatible med Intel 80386-prosessoren fra de for inkompatible serier som Itanium . IA-32-settet er implementert i alle CPUer i den store x86 -familien etter 80386, det vil si 32-biters . Programmer som brukes med en av disse prosessorene kan kjøre i beskyttet modus, bruke minne større enn 640K, ha virtuelt minne og et multitasking -miljø . Videre kan de få tilgang til en lineær minneplass på omtrent 4 GB.
IA-32 støtter tre driftsmoduser: ekte modus , beskyttet modus og virtuell 8086-modus . I beskyttet modus kan programmer dra full nytte av prosessoren og alt minnet som er tilgjengelig på maskinen, mens i ekte modus og virtuell 8086-modus har programvaren kun én megabyte RAM tilgjengelig og prosessoren oppfører seg som en enkel 8086.
80386 CPU (og alle dens etterfølgere) har 4 generelle 32-bits registre og 6 segmentregistre, pluss flaggregisteret, to indeksregistre og to stackstyringsregistre. Til disse ofte brukte registrene legges noen for spesielle oppgaver: det er 4 kontrollregistre, 6 feilsøkingsregistre og 4 testregistre, i tillegg selvfølgelig til segmentbeskrivelsesregistrene som er nødvendige for implementering av virtuelle minnemekanismer. 80387 matematikk-koprosessoren la til ytterligere 8 flytende kommaregistre til systemet. Følgende prosessorer inkorporerte den matematiske koprosessoren og introduserte andre registre for SIMD- instruksjoner , for eksempel MMX , 3DNow! og SSE , men uten noen gang å forlate det originale settet med registre på 386.
X86-registre for generell bruk er egentlig ikke ment for generell bruk, slik definisjonen tilsier, på grunn av noen spesifikke prosesser som ofte kan utføres med bare ett eller to av disse registrene. I andre arkitekturer kan registrene for generell bruk brukes på en helt utydelig måte, mens x86-registrene er delt mellom spesifikt for data og spesifikt for adresser.
Videre kan mange operasjoner utføres enten i et register eller direkte i RAM, uten at dataene må lastes inn i et register. Denne oppførselen demonstrerer tretti års alder av denne arkitekturen.
Merk: med ankomsten av AMD64 -utvidelsen til x86 - arkitekturen har denne funksjonen blitt eliminert, i det minste i 64-bits modus: nå er registrene for generell bruk egentlig for generell bruk, uten forskjell. Dette påvirker imidlertid ikke IA-32-arkitekturen.
8 og 16 bits registreDet er også mulig å få tilgang til flere sett med 8 og 16 bits registre. For eksempel kan de nederste 16 bitene i 32-biters EAX -registeret nås ved å kalle dem AX . Noen 16-bits registre kan videre deles inn i 8-biters registre: den øvre halvdelen av 16-biters AX -registeret som vises ovenfor kalles AH og den nedre AL . Tilsvarende deler EBX 32-bits registeret seg i BX (16-bit), videre delt inn i BH (8-bit) og BL (8-bit).
Generiske dataregistreAlle følgende registre kan brukes til generell bruk, men også til spesialiserte prosesser; hver av dem kan deles inn i 16 eller 8 bits registre.
Brukes kun til adressering. De kan deles inn i 16-bits men ikke 8-bits registre.
Siden introduksjonen av 80486 er det 8 x87 flyttallregister, nummerert fra ST (0) til ST (7). Hvert register inneholder 80 biter og lagrer tall i formatet "utvidet dobbel presisjon" til IEEE 754 -standarden . Disse registrene kan ikke nås direkte, men som en LIFO -stack . Registernummeret er ikke fast, men refererer til toppen av stabelen: ST (0) er registeret på toppen av stabelen, ST (1) er det nederste, ST (2) er fortsatt lavere, og så videre . Dette betyr at et datum alltid presses ned, og at operasjonene alltid utføres med operanden øverst i stabelen: det er ikke mulig å få tilgang til et gitt register tilfeldig, men bare i rekkefølge.
SegmentregistreSegmentregistre brukes av 80386 for å generere en lineær adresse fra en logisk adresse. Den logiske adressen er gitt av segmentparet register : offset (offset kan være en konstant, et basisregister, en indeks eller en kombinasjon av de tre, med noen regler/unntak). Den lineære adressen blir deretter transformert til en fysisk adresse av prosessorens personsøkingsmekanisme . Det er 6 segmentregistre:
Merk: FS- og GS-registre ble lagt til i 80386 (de var ikke til stede i tidligere prosessorer) og navnet deres er en enkel fortsettelse av alfabetet fra E av ES.
Merk: Når du vil referere til en minneadresse i IA-32-arkitekturen, brukes formen <SEGMENT>: <OFFSET> . Segmentet uttrykkes gjennom ett av de 6 segmentregistrene (selv om det i noen tilfeller er mulig å uttrykke det med en konstant verdi) mens offset indikerer avviket innenfor segmentet. Instruksjoner hentes for eksempel alltid fra minnet på adressen som CS: EIP -paret peker på .
80386 har et register over flagg, kalt EFLAG. Selv om det ikke er direkte tilgjengelig med et navn (som EAX, for eksempel), er det mulig å lese og skrive det på en eller annen måte. Bare et par instruksjoner er nødvendig:
/ * Lese statusen til flaggregisteret * / PUSHFD; Lagrer statusen til flaggene på stabelen POP EAX; Trekk ut fra stabelen og lagre til EAX (eller annen generell logg)For å endre tilstanden til flaggene i stedet, er følgende to instruksjoner nødvendig:
/ * Endre statusen til flaggene * / PUSH EAX; Lagre EAX-logg på stabelen (eller annen generell logg) POPFD; Trekk ut fra stabelen og lagre i flaggregisteretDe forrige instruksjonene lagrer og gjenoppretter tilstanden til EFLAG (32-biters versjon av 80386-flaggene). Bare de minst signifikante 16 bitene kan lagres / gjenopprettes ved å bruke henholdsvis PUSHF / POP AX og PUSH AX / POPF. Størrelsen (16 eller 32 biter) som brukes, avhenger av størrelsen på operanden. Det operandtvingende prefikset (op-kode 0x66) lar deg variere størrelsen innenfor gjeldende kontekst: hvis den brukes i 16-bits modus, vil mikroprosessoren behandle instruksjonen som 32-bit og omvendt.
Flaggregisteret er et 16-bits register hvor noen biter (eller gruppering av dem) er tildelt en presis betydning og indikerer statusen til prosessoren. Hvis biten er satt til 1, settes flagget (sett), hvis satt til 0 betyr det at det er tilbakestilt (tilbakestilt eller slettet).
Tallene indikerer posisjonen i biter, forkortelsene indikerer det symbolske navnet på flagget.
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 1. 3 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
V8 | RF | NT | PL | PL | AV | DF | HVIS | TF | SF | ZF | AF | PF | CF |
Betydningen av flaggene:
De resterende bitene brukes ikke og er reservert for fremtidig bruk; verdien deres bør ikke endres, og hvis den leses, bør den ikke tas i betraktning.
MMX , 3DNow ! _ , og SSE har egne registre, i tillegg til standard IA-32.
MMX-registreMMX har 8 registre, kalt MM0 til MM7 (herfra MMn ), som imidlertid fysisk er de samme x87-registrene for FPU -flytpunktberegningen, så det er umulig å bruke MMX- og kommainstruksjonene samtidig. mobil: før du bruker MMX-instruksjonssettet, må FPU-en deaktiveres med en spesifikk instruksjon.
Hvert av MMn-registrene inneholder et 64-bits heltall, men en av de grunnleggende egenskapene til dette instruksjonssettet er konseptet med en vektor , dannet av flere lignende data: derfor kan to ord på 32 biter hver lagres
Igjen fordi MMn-registrene er i "fysisk samliv" med x87-registrene, som inneholder 80 biter hver, i utførelsen av MMX er de første 16 bitene av registeret bortkastet: de er derfor alle satt til 1, slik at dataene tilstede blir gjenkjent som "NaN" eller uendelig av en flyttall-applikasjon, noe som gjør det enkelt å gjenkjenne om flytende komma- eller MMX-data brukes.
Registrer 3DNow!3DNow ! den ble designet som en naturlig forlengelse av MMX-instruksjoner for flytende kommaberegning; den bruker derfor de samme navnene som MMn-registrene, men i stedet for å lagre 64-bits ord i den , introduserer den flytende kommatall med enkelt presisjon.
Fordelen med å bruke x87-registrene også i dette tilfellet er at de allerede er dedikert til flyttallsberegningen, og derfor kan x87-instruksjonene brukes til å utføre lignende operasjoner med å lagre registrene også i 3DNow!-koden: det følger at Det kreves ingen endringer i operativsystemet for å bruke denne teknologien.
SSE-registreMed SSE ble SIMD-instruksjonene gjort helt uavhengige av x87-registrene. Men dette betydde også definitivt å flytte bort fra andre SIMD- instruksjonssett , for eksempel MMX; innsats begrunnet med muligheten for å bruke større registre, fri fra flytepunktets grenser. Åtte 128-biters registre ble opprettet, kalt XMM0 til XMM7 (merk: i AMD64-arkitekturen er registrene økt til 16).
Ulempen er at du må sette inn det nye settet med instruksjoner i operativsystemet. Intel opprettet derfor en ny versjon av beskyttet modus, kalt " Enhanced mode ", som tillater bruk av SSE-instruksjoner, deaktivert i normal beskyttet modus: et operativsystem som inkluderer SSE-instruksjoner får tilgang til den nye modusen, mens en eldre eller en som uansett hva det er. ikke inkluderer dem, vil den bare forsøke å få tilgang til normal beskyttet modus.
SSE er et instruksjonssett som kun opererer på flyttallsdata, slik som 3DNow!, men i motsetning til dette bruker den ikke stabelregistrene til FPU, men sitt eget separate sett med registre, som kan inneholde dobbelt så mange presisjonssingler. Mens den første SSE var begrenset til enkeltpresisjonstall, var det med SSE2 også mulig å håndtere doble presisjonstall. For 3DNow! dette var ikke mulig, siden et enkelt tall i denne presisjonen ville okkupere hele 64-bits registeret, mens XMMn-registrene er 128-biter: SSE2 er derfor mye mer egnet for vitenskapelige applikasjoner enn sine to forgjengere.
Strukturen til en generisk IA-32-instruksjon er variabel i henhold til den spesifikke op-koden, og kan innledes med prefikser (opptil fire) som endrer oppførselen: en generell beskrivelse er gitt i tabellen nedenfor.
Prefikser | Instruksjon | |||||||
---|---|---|---|---|---|---|---|---|
Instruksjon | Operand størrelse | Adressestørrelse | segmentutskifting | Opcode | Modus R/M | JA B | Skifte | Umiddelbar |
1 byte | 1 byte | 1 byte | 1 byte | 1 eller 2 byte | 1 byte | 1 byte | 1, 2 eller 4 byte | 1, 2 eller 4 byte |
Opt. | Opt. | Opt. | Opt. | OBLIGATORISK | Opt. | Opt. | Opt. | Opt. |
Mode R/M -byten spesifiserer videre instruksjonsoperanden og kan inneholde et opkodetillegg, mens SIB ( Scale Index Base)-byten alltid spesifiserer et 32-bits register (EAX, EBX etc.) og er karakteristisk for prosessorer IA-32.
Byte-modus R/M | ||
---|---|---|
Modus | Reg / Opcode | R/M |
2 bit | 3 bit | 3 bit |
Byte SIB | ||
---|---|---|
Trapp | Indeks | Utgangspunkt |
2 bit | 3 bit | 3 bit |
Følgende tabell viser IA-32-instruksjonene, organisert alfabetisk i henhold til deres samlingsmnemoniske kode . De heksadesimale opcpdes og, i klokkesykluser, utførelsestidene for en 80386. Hvis det er en stjerne i stedet for opkoden, er det fordi instruksjonen har mange forskjellige opkoder i henhold til de forskjellige formene; til og med utførelsestidene varierer avhengig av tilstanden som prosessoren er plassert i: på en beskyttet måte "koster" mange tilganger til minnet flere klokkesykluser, og en mulig kontekstsvitsj kan øke tidene betraktelig. Flagg satt til standardverdier er merket med verdien 0 eller 1 de antar; hvis de er modifisert i samsvar med resultatet av operasjonen, er de merket med en stjerne; hvis de er modifisert, men på en udefinert måte er de merket med et spørsmålstegn.
montering | Opcode (hex) | Klokke sykluser | Byttet flagg | Beskrivelse |
---|---|---|---|---|
AAA | 37 | 4 | oditszapc ? ?? *? * |
ASCII-justering etter addisjon (for BCD -aritmetikk ) |
AAD | D5 0A | 19 | oditszapc ? ?? *? * |
ASCII-justering før divisjon (for BCD -aritmetikk ) |
AAM | D4 0A | 17 | oditszapc ? ?? *? * |
ASCII-justering etter multiplikasjon (for BCD - aritmetikk ) |
AAS | 3F | 4 | oditszapc ? ?? *? * |
ASCII-justering etter subtraksjon (for BCD - aritmetikk ) |
ADC | * | 2-7 | oditszapc ****** |
Legg til med bære. |
LEGGE TIL | * | 2-7 | oditszapc ****** |
Sum. |
OG | * | 2-7 | oditszapc 0 **? * 0 |
Den utfører den bitvise logiske OG mellom de to operandene, hvorav en implisitt kan være AL / AX / EAX-registeret. |
ARPL | 63 | 21 | oditszapc * |
Justering av RPL-feltet til segmentvelgeren. Den brukes i operativsystemer for å sikre at et program ikke kaller en subrutine som har høyere rettigheter enn selve programmet. |
BUNDET | 62 | 10 | oditszapc |
Sjekk at operanden er innenfor visse grenser. Dette er for å unngå utilsiktet adressering av områder utenfor en array: vanligvis, av effektivitetsgrunner, brukes den bare i feilsøkingsversjonene av et program. |
BSF | 0F f.Kr | * | oditszapc * |
Foroverskanning av bitene i operanden. |
BSR | 0F BD | * | oditszapc * |
Skanning bakover av bitene i operanden. |
BT | * | 3-12 | oditszapc * |
Test av den angitte biten av operanden |
BTC | * | 6-13 | oditszapc * |
Test av den angitte biten av operanden og dens negasjon |
BTR | * | 6-13 | oditszapc * |
Test den angitte biten av operanden og sett den til 0 |
BTS | * | 6-13 | oditszapc * |
Test den angitte biten av operanden og sett den til 1 |
ANROP | * | 7-98+ | oditszapc alle |
Prosedyre eller subrutineanrop |
CBW | 98 | 3 | oditszapc |
Konvertering fra byte til ord |
CDQ | 99 | 2 | oditszapc |
Doubleword til quadword konvertering |
CLC | F8 | 2 | oditszapc 0 |
Tilbakestilling av Carry-flagget |
CLD | FC | 2 | oditszapc 0 |
Tilbakestilling av retningsflagget |
CLI | GJØR | 3 | oditszapc 0 |
Tilbakestilling av avbruddsflagget |
CLTS | 0F 06 | 5 | oditszapc (note 1) |
Tilbakestilling av oppgavebytteflagget (TS) i spesialregisteret CR0 |
CMC | F5 | 2 | oditszapc * |
Negasjon av Carry-flagget |
CMP | * | 2-6 | oditszapc ****** |
Sammenligning mellom to operander |
CMPS * | * | 10 | oditszapc ****** |
Sammenligning mellom to minnestrenger hvis relative adresser er lagret i indeksregistrene SI (eller ESI) og DI (eller EDI): begge registre reduseres med én. Avhengig av om byte, ord eller dobbeltord skal vurderes, er variantene CMPS, CMPSB, CMPSW og CMPSD tilgjengelige. Svært ofte brukes denne instruksjonen med prefikser REP * for automatisk å sammenligne hele minneområder. |
CWD | 99 | 2 | oditszapc |
Konvertering fra ord til dobbeltord |
CWDE | 98 | 2 | oditszapc |
Konvertering fra ord til dobbeltord |
FRA TIL | 27 | 4 | oditszapc ? ***** |
Desimaljustering etter addisjon (for BCD- aritmetikk ) |
DAS | 2F | 4 | oditszapc ? ***** |
Desimaljustering etter subtraksjon (for BCD- aritmetikk ) |
DES | * | 2-6 | oditszapc * **** |
Reduserer den angitte operanden med én |
DIV | * | 38-41 | oditszapc ? ????? |
Usignert divisjon. |
TAST INN | * | 10- | oditszapc |
Opprette stabelrammen som kreves for prosedyrekall på høyt nivå. |
HLT | F4 | 5 | oditszapc |
Stopp prosessoren. Ingen nye instruksjoner utføres etter en HLT før et avbrudd eller tilbakestilling oppstår: i tilfelle et avbrudd, etter servicerutinen, gjenopptar prosessoren kjøringen fra instruksjonen etter HLT. Vanligvis brukes denne instruksjonen for synkronisering eller energisparing. |
IDIV | * | 19-43 | oditszapc ? ????? |
Inndeling med skilt. |
IMUL | * | 9-41 | oditszapc * ???? * |
Multiplikasjon med fortegn |
I | * | 12+ | oditszapc |
Les en byte eller et ord fra I/O-porten spesifisert i operanden. |
INC | * | 2-6 | oditszapc * **** |
Øk operanden med én. |
INS * | * | 15-29 | oditszapc |
Les en byte eller et ord fra den angitte I/O-porten i den angitte strengen fra DI (eller EDI) indeksregisteret. Brukes ofte med REP *-prefikser for automatisk å lese hele datavektorer. |
INT | * | 33-119 | oditszapc 00 |
Stopper gjeldende kjøring og utfører avbruddssubrutinen spesifisert av operanden. |
INN I | DET ER | 59-119 | oditszapc |
Stopper gjeldende kjøring og utfører avbruddssubrutinen dedikert til overløp. Det står for INT 4 . |
IRET / IRETD | CF | 22-82 | oditszapc ALLE |
Gå tilbake fra en avbruddssubrutine. |
Jcc | * | 7+ | oditszapc |
Betinget hopp. Hoppet til den spesifiserte adressen utføres bare hvis visse flagg har en viss verdi: ellers fortsetter utførelsen normalt med neste instruksjon. Det finnes mange typer betingede hopp. |
JMP | * | 7-49+ | oditszapc |
Hopp til et annet sted. Programkjøringen fortsetter med start fra plasseringen angitt av hoppargumentet: hvis argumentet ikke peker til en gyldig instruksjon, blir det kastet et unntak og programmet stopper. |
LAHF | 9F | 2 | oditszapc |
Kopier flaggregisteret til AH-registeret |
LAR | 0F 02 | 16 | oditszapc * |
Laster tilgangsrettighetsbyten inn i segmentbeskrivelsen. Denne instruksjonen brukes til å angi privilegiene til et bestemt segment: det er en privilegert instruksjon og brukes kun av operativsystemet. |
LEA | 8D | 2 | oditszapc |
Laster den faktiske adresseforskyvningen. |
PERMISJON | C9 | 4 | oditszapc |
Gå ut av en prosedyre med et språk på høyt nivå: det er den symmetriske instruksjonen til ENTER og den ødelegger stabelrammen til den avsluttede prosedyren. |
LGDT | 0F 01/2 | 11 | oditszapc |
Laster segmentets globale beskrivelsestabellregister: Denne instruksjonen brukes kun av operativsystemer, en brukeragent har ingen grunn til å bruke den. |
LOKK | 0F 01/3 | 11 | oditszapc |
Laster avbruddstabellregisteret. Dette gjøres en gang for alle ved oppstart fra operativsystemet. |
L * S | * | 7-25 | oditszapc |
Laster et komplett pekersegment: offset. De ulike formene for instruksjonen (LGS, LFS, LDS, LES, LSS) spesifiserer hvilket segmentregister som skal inneholde segmentdelen av pekeren. |
LLDT | 0F 00/2 | 20 | oditszapc |
Laster det lokale deskriptortabellregisteret. Som alle segmentbeskrivelser, brukes denne kun av operativsystemer. |
LMSW | 0F 01/6 | 10-13 | oditszapc |
Laster maskinstatusordet |
LODS * | * | 5 | oditszapc |
Laster inn en strengoperand. Operaanden som SI- (eller ESI)-registeret peker på, lastes inn i AL / AX / EAX, avhengig av hvilken versjon av instruksjonen som brukes (LODS, LODSB, LODSW, LODSD) |
LØKKE * | * | 11+ | oditszapc |
Betinget hopp basert på verdien av CX / ECX registeret. Etter hoppet reduseres CX / ECX med én: når registeret er null, utføres hoppet ikke lenger. |
LSL | 0F 03 | 20-26 | oditszapc * |
Last inn segmentgrensen i dens beskrivelse, spesifisert i operanden. Det er for eksklusiv bruk av operativsystemet. |
LTR | 0F 00/3 | oditszapc |
Laster oppgaveregisteret med registeret eller minneplasseringen spesifisert av operanden. Denne instruksjonen er også privilegert og brukes kun av operativsystemer. | |
MOV | * | 2-4 | oditszapc |
Kopier den andre operanden inn i den første. |
MOVS * | * | 7 | oditszapc |
Kopier gjeldende verdi i en bestemt posisjon av en streng til den tilsvarende posisjonen til den andre. Det brukes ofte med prefikser REP *. |
MOVSX | 0F BE | 3-6 | oditszapc |
Kopierer den andre operanden inn i den første og utvider tegnet. |
MOVZX | * | 3-6 | oditszapc |
Kopierer den andre operanden til den første og sletter resten av den første operanden. |
MUL | * | 9-41 | oditszapc * ???? * |
Usignert multiplikasjon av AL eller AX |
NEG | * | 2-6 | oditszapc ****** |
Negasjon av de tos komplementoperand |
NOP | 90 | 3 | oditszapc |
Ingen operasjon. Synonym til XCHG AX, AX (se). |
IKKE | * | 2-6 | oditszapc |
Logisk negasjon av operanden |
ELLER | * | 2-7 | oditszapc 0 **? * 0 |
Logisk eller inkluderende av to operander. |
UTE | * | 10-25 | oditszapc |
Skrive en byte eller et ord til I/O-porten spesifisert av operanden. |
OUTS * | * | 8-28 | oditszapc |
Skrive en byte eller et ord av en streng til I/O-porten spesifisert av operanden. |
POP* | * | 5-24 | oditszapc ********* |
Laster noen registre fra stabelen . Verdien av pekeren til toppen av stabelen, Stack Pointer SP, reduseres med så mange enheter som byte har blitt lest. |
PUSH * | * | 2-18 | oditszapc |
Skriver til stabelen av noen registre. Verdien av pekeren til toppen av stabelen, Stack Pointer SP, reduseres med så mange enheter som byte er skrevet. |
RCL | * | 9-10 | oditszapc * * |
Venstrerotasjon av operanden med bære: alle bitene i operanden flyttes en posisjon til venstre og verdien av bæreflagget kopieres inn i den som står fri, som antar verdien til biten som kom ut fra høyre. |
RCR | * | 9-10 | oditszapc * * |
Rotasjon til høyre for operanden med carry: alle bitene i operanden flyttes en posisjon til høyre og verdien av bæreflagget kopieres til den som står fri, som antar verdien til biten som kom ut fra venstre. |
RET | * | 10-68 | oditszapc |
Gå tilbake fra en subrutine eller prosedyre på lavt nivå. |
ROL | * | 3-7 | oditszapc * * |
Venstrerotasjon av operanden: alle bitene i operanden flyttes en posisjon til venstre og den venstre helt til venstre kopieres til den frigjorte posisjonen til høyre. |
ROR | * | 3-7 | oditszapc * * |
Rotering av operanden til høyre: alle bitene i operanden flyttes en posisjon til høyre og den som forlates helt til høyre kopieres til den frigjorte posisjonen til venstre. |
SAHF | 9E | 3 | oditszapc ********* |
Skrive innholdet i AH til flaggregisteret. |
SAL | * | 3-7 | oditszapc * **? ** |
Skifter bitene av operanden N ganger til venstre: bitene som har rømt fra venstre går tapt. Hvis ingen biter går tapt , tilsvarer denne operasjonen å multiplisere med 2 N. |
SAR | * | 3-7 | oditszapc * **? ** |
Skifter bitene av operanden N ganger til høyre: biter som har rømt fra høyre går tapt. Denne operasjonen tilsvarer å dele med 2 N uten rest. |
SBB | * | 2-7 | oditszapc ****** |
Heltallssubtraksjon med overføring. |
SCAS * | * | 7 | oditszapc ****** |
Sammenligning av strenger. Minneplasseringene som SI- og DI-registrene (eller ESI og EDI) peker på, sammenlignes og de to registrene økes/nedsettes med én avhengig av verdien til D-flagget. Denne instruksjonen brukes ofte med prefikser REP *. |
SETcc | * | 4-5 | oditszapc |
Byte-innstilling i henhold til spesifisert tilstand. På samme måte som Jcc-instruksjonene, hvis flaggverdiene er de som er pålagt av den spesielle versjonen av SETcc som brukes, skrives verdien 1 i byteoperanden. |
SGDT | 0F 01/0 | 9 | oditszapc |
Lagring av den globale deskriptortabellen. For eksklusiv bruk og forbruk av operativsystemer. |
SHL | * | 3-7 | oditszapc * **? ** |
Venstreforskyvning av bitene i operanden: biten som har rømt fra venstre går tapt. Hvis det var null, tilsvarer operasjonen å multiplisere med 2. |
SHLD | * | 3-7 | oditszapc ? **? ** |
Venstreforskyvning av bitene i operanden i dobbel presisjon. Som SHL, men det innebærer også et andre register, knyttet til det første. |
SHR | * | 3-7 | oditszapc * **? ** |
Skift til høyre for bitene i operanden: biten som har rømt fra høyre går tapt. Operasjonen tilsvarer divisjon med 2 uten rest. |
SIDT | 0F 01/1 | 9 | oditszapc |
Lagring av avbruddstabellen i beskyttet modus. For eksklusiv bruk og forbruk av operativsystemer. |
SHRD | * | 3-7 | oditszapc ? **? ** |
Høyre forskyvning av bitene i operanden i dobbel presisjon. Som SHR, men det innebærer også et andre register, knyttet til det første. |
SLDT | 0F 00/0 | 2 | oditszapc |
Laster det lokale deskriptortabellregisteret. Brukes kun i operativsystemer. |
SMSW | 0F 01/4 | 2-3 | oditszapc |
Lagre maskinstatusordet |
STC | F9 | 2 | oditszapc 1 |
Sett Carry-flagget til ett |
STD | FD | 2 | oditszapc 1 |
Sett retningsflagget til ett |
STI | FB | 3 | oditszapc 1 |
Sett avbruddsflagget til ett |
STOS * | * | 4 | oditszapc |
Lagrer verdien av AL / AX / EAX i posisjonen til en streng pekt på av DI (eller EDI). Deretter økes / reduseres verdien av (E) DI i henhold til verdien til D-flagget. |
STR | 0F 00/1 | 23-27 | oditszapc |
Lagrer oppgaveloggen. Kun nyttig for operativsystemer. |
UNDER | * | 2-7 | oditszapc ****** |
Heltallssubtraksjon. |
TEST | * | 2-5 | oditszapc 0 **? * 0 |
Ikke-destruktiv logisk sammenligning av to operander. Den logiske OG mellom de to utføres, men resultatet lagres ikke: bare flaggene endres. |
VERR | 0F 00/4 | 10-11 | oditszapc * |
Verifisering av tilgang ved lesing av et segment: hvis ja, er nullflagget satt til 1, ellers tilbakestilles det. |
VERW | 0F 00/5 | 15-16 | oditszapc * |
Verifisering av skrivetilgang til et segment: hvis ja, er nullflagget satt til 1, ellers tilbakestilles det. |
VENTE | 9B | 6 | oditszapc |
Prosessoren stopper til det eksterne BUSY #-signalet (som kommer fra matematisk koprosessor) er deaktivert: det brukes til å synkronisere beregningene til koprosessoren med beregningene til hoved-CPU. |
XCHG | * | 3-5 | oditszapc |
Bytt om verdiene til de to operandene. |
XLAT / XLATB | D7 | 5 | oditszapc |
Transformasjon med oppslagstabell. Den nåværende verdien til AL erstattes med den i minnecellen i tabellen som DS viser til: BX + AL selv. |
XOR | * | 2-7 | oditszapc 0 **? * 0 |
Eksklusiv logisk ELLER mellom to operander. |
Dette er det komplette instruksjonssettet for prosessoren 80386. Den nye Intel IA-64- arkitekturen er ikke direkte kompatibel med IA-32-instruksjoner.