IA-32

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.

Historie

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.

Driftsmodus for IA-32-prosessorer

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.

Registrerer

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.

Generelle formålsregistre

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 registre

Det 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 dataregistre

Alle 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.

Adresseregistre

Brukes kun til adressering. De kan deles inn i 16-bits men ikke 8-bits registre.

Stable registre for flyttall

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.

Segmentregistre

Segmentregistre 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å .

Flaggregister

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 flaggregisteret

De 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.

SIMD-registrerer

MMX , 3DNow ! _ , og SSE har egne registre, i tillegg til standard IA-32.

MMX-registre

MMX 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-registre

Med 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.

Ekstra SIMD-instruksjonssett

  • MMX -utvidelser var den første store oppdateringen: de var SIMD- instruksjoner som bare var egnet for heltallsberegning. De ble introdusert sammen av Intel og AMD i deres Pentium MMX og K6 i 1997 . Den delte registre med x87 FPU , så operativsystemet måtte ikke endres for å bruke disse instruksjonene hvis det støttet x87-tilstandslagring.
  • MMX ble oppdatert med 3DNow! , som støttet flytende punkt , av AMD i 1999 med K6-2 . Disse brukte også x87-registre. Intel vurderte aldri denne teknologien.
  • Intel introduserte SSE -instruksjoner , med støtte for enkeltpresisjons flyttallsdata, med Pentium III-prosessoren i 1999. I motsetning til 3DNow !, var de ikke en utvidelse av MMX og utnyttet ikke x87 FPU-registrene, og krevde endringer til operativsystemet som skulle utnyttes, men var fri fra begrensningene pålagt av x87-registrene. Disse instruksjonene og dens påfølgende utvidelser ble også tatt i bruk av AMD fra og med Athlon XP , og dette videreutviklet ikke 3DNow!.
  • SSE2 ble introdusert med Pentium 4 tidlig i 2001 ; var en ytterligere forbedring av SSE, med tillegg av støtte for dobbelpresisjonstall.
  • SSE3 , introdusert med Pentium 4 Prescott i 2004 , ga sekundære tillegg til SSE2.

IA-32 instruksjonsformat

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.

Relaterte elementer