IA-32

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

IA-32 ( Intel Architecture 32 bit ), uneori i386 , definește arhitectura sau setul de instrucțiuni al microprocesoarelor produse de Intel , AMD și alte companii minore pentru piața desktopurilor din 1985 și care este prezent în marea majoritate a computerelor personale din lumea. Este adesea menționată ca o arhitectură CISC , dar aceste distincții își pierd din ce în ce mai mult sensul pe măsură ce tehnologia avansează.

Istorie

Termenul a fost inventat pentru a distinge setul de instrucțiuni pentru procesoarele compatibile cu procesorul Intel 80386 de cele pentru serii incompatibile, cum ar fi Itanium . Setul IA-32 este implementat în toate procesoarele din familia x86 mare după 80386, adică pe cele pe 32 de biți . Programele care sunt utilizate cu unul dintre aceste procesoare pot rula în modul protejat, pot utiliza memorie mai mare de 640K, au memorie virtuală și un mediu de multitasking . În plus, pot accesa un spațiu liniar de memorie de aproximativ 4 GB.

Mod de operare a procesoarelor IA-32

IA-32 acceptă trei moduri de funcționare: modul real , modul protejat și modul virtual 8086 . În modul protejat, programele pot profita din plin de procesor și toată memoria disponibilă pe aparat, în timp ce în modul real și în modul virtual 8086, software-ul are doar un megabyte de RAM disponibil, iar procesorul se comportă ca un simplu 8086.

Registrele

CPU 80386 (și toți succesorii săi) are 4 registre pentru 32 de biți de uz general și 6 registre de segmente, plus registrul de steag al celor două registre de index și două registre pentru gestionarea stivei. La aceste registre utilizate în mod obișnuit se adaugă unele pentru sarcini particulare: există 4 registre de control, 6 registre de depanare și 4 registre de testare, în plus, desigur, la registrele descriptorului de segmente necesare implementării mecanismelor de memorie virtuală. Coprocesorul matematic 80387 a adăugat încă 8 registre în virgulă mobilă la sistem. Următoarele procesoare au încorporat coprocesorul matematic și au introdus alte registre pentru instrucțiunile SIMD , cum ar fi MMX , 3DNow! și SSE , dar fără a abandona vreodată setul original de registre din 386.

Registrele cu scop general

Registrele de uz general X86 nu sunt cu adevărat destinate utilizării generale, așa cum ar indica definiția, datorită unor procese specifice care pot fi adesea efectuate folosind doar unul sau două dintre aceste registre. În alte arhitecturi, registrele de uz general pot fi utilizate într-un mod absolut indistinct, în timp ce registrele x86 sunt împărțite între specific pentru date și specific pentru adrese.

În plus, multe operații pot fi efectuate fie într-un registru, fie direct în memorie RAM, fără a fi nevoie să încărcați datele într-un registru. Acest comportament demonstrează vârsta de treizeci de ani a acestei arhitecturi.

Notă: odată cu sosirea extensiei AMD64 la arhitectura x86 această caracteristică a fost eliminată, cel puțin în modul pe 64 de biți: acum registrele pentru uz general sunt într-adevăr pentru uz general, fără distincție. Cu toate acestea, acest lucru nu afectează arhitectura IA-32.

Registre de 8 și 16 biți

De asemenea, este posibil să accesați seturi suplimentare de registre de 8 și 16 biți. De exemplu, puteți accesa cei 16 biți inferiori ai registrului EAX pe 32 de biți apelându -i AX . Unele registre pe 16 biți pot fi împărțite în continuare pe registre pe 8 biți: jumătatea superioară a registrului AX pe 16 biți văzut mai sus se numește AH și AL inferioară. În mod similar, registrul EBX pe 32 de biți se împarte în BX (16 biți), împărțit în continuare în BH (8 biți) și BL (8 biți).

Registre de date generice

Toate registrele următoare pot fi utilizate pentru uz general, dar și pentru procese specializate; fiecare dintre ele poate fi împărțit în registre de 16 sau 8 biți.

  • EAX - acumulator (specializat pentru instrucțiuni aritmetice)
  • EBX - registru de bază (utilizat pentru a adresa date din segmentul de memorie)
  • ECX - contor (specializat pentru cicluri)
  • EDX - registru de date

Registrele de adrese

Folosit numai pentru adresare. Ele pot fi împărțite în registre pe 16 biți, dar nu pe 8 biți.

  • EBP - pointer de bază (conține adresa cadrului de stivă utilizat în prezent)
  • ESI - index sursă (utilizat pentru șiruri )
  • EDI - index destinație (utilizat pentru șiruri )
  • ESP - indicatorul stivei (conține prima adresă a stivei )
  • EIP - indicator de instrucțiuni (conține adresa următoarei instrucțiuni)

Stive registre pentru virgulă mobilă

De la introducerea modelului 80486 există 8 x87 registre în virgulă mobilă, numerotate de la ST (0) la ST (7). Fiecare registru conține 80 de biți și stochează numere în formatul „precizie dublă extinsă” al standardului IEEE 754 . Aceste registre nu pot fi accesate direct, ci ca o stivă LIFO . Numărul de registru nu este fix, ci se referă la partea de sus a stivei: ST (0) este registrul din partea de sus a stivei, ST (1) este cel inferior, ST (2) este încă mai jos și așa mai departe . Aceasta înseamnă că o datum este întotdeauna împinsă în jos și că operațiunile sunt întotdeauna efectuate cu operandul conținut în partea de sus a stivei: nu este posibil să accesați un registru dat în mod aleatoriu, ci doar în ordine.

Registre de segmente

Registrele de segmente sunt utilizate de 80386 pentru a genera o adresă liniară de la o adresă logică. Adresa logică este dată de perechea de registre de segmente : offset (offsetul poate fi o constantă, un registru de bază, un index sau o combinație a celor trei, cu unele reguli / excepții). Adresa liniară este apoi transformată într-o adresă fizică de către mecanismul de paginare al procesorului. Există 6 registre de segmente:

  • CS - segment de cod (este implicit utilizat de procesor, asociat cu registrul EIP, pentru a prelua următoarea instrucțiune)
  • DS - segment de date (utilizat, implicit, în accesarea memoriei printr-o instrucțiune)
  • SS - segment de stivă (utilizat în tandem cu ESP pentru a gestiona stiva )
  • ES - segment suplimentar (utilizat ca jurnal suplimentar pentru date, similar cu segmentul de date)
  • FS - segment suplimentar ( segment suplimentar pentru date, pentru uz general)
  • GS - segment suplimentar ( segment suplimentar pentru date, pentru uz general)

Notă: Registrele FS și GS au fost adăugate în 80386 (nu erau prezente în procesoarele anterioare) și numele lor este o simplă continuare a alfabetului din E de ES.

Notă: Când doriți să faceți referire la o adresă de memorie în arhitectura IA-32, este utilizat formularul <SEGMENT>: <OFFSET> . Segmentul este exprimat printr-unul dintre cele 6 registre de segmente (deși în unele cazuri este posibil să se exprime cu o valoare constantă) în timp ce compensarea indică abaterea în cadrul segmentului. De exemplu, instrucțiunile sunt preluate întotdeauna din memorie la adresa indicată de perechea CS: EIP .

Registrul steagului

80386 are un registru de steaguri, numit EFLAG. Deși nu este accesibil direct de un nume (cum ar fi EAX, de exemplu), este cumva posibil să-l citiți și să-l scrieți. Sunt necesare doar câteva instrucțiuni:

 / * Citirea stării registrului de steaguri * /
 PUSHFD; Salvează starea steagurilor de pe stivă
 POP EAX; Extrageți din stivă și salvați în EAX (sau în orice alt jurnal general)

Pentru a modifica, în schimb, starea steagurilor, sunt necesare următoarele două instrucțiuni:

 / * Modificarea stării steagurilor * /
 PUSH EAX; Salvați jurnalul EAX în stivă (sau orice alt jurnal general)
 POPFD; Se extrage din stivă și se stochează în registrul de steaguri

Instrucțiunile anterioare salvează și restaurează starea EFLAG (versiunea pe 32 de biți a steagurilor 80386). Numai cei mai puțin semnificativi 16 biți pot fi salvați / restaurați utilizând PUSHF / POP AX și respectiv PUSH AX / POPF. Dimensiunea (16 sau 32 de biți) utilizată depinde de dimensiunea operandului. Prefixul de forțare operand (cod op 0x66) vă permite să variați dimensiunea în contextul curent: dacă este utilizat în modul pe 16 biți, microprocesorul va trata instrucțiunea ca pe 32 de biți și invers.

Registrul steagurilor este un registru pe 16 biți în care unor biți (sau gruparea lor) li se atribuie o semnificație precisă și indică starea procesorului. Dacă bitul este setat la 1, pavilionul este setat (setat), dacă este setat la 0 înseamnă că este resetat (resetat sau șters).

Numerele indică poziția în biți, abrevierile indică numele simbolic al steagului.

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
V8 RF NT PL PL DE DF DACĂ TF SF ZF AF PF CF

Înțelesul steagurilor:

  • V8 - modul Virtual 86 (dacă este setat, indică faptul că vă aflați în modul Virtual-8086)
  • RF - Reluare semnal (dacă este setat, activează excepții în modul de depanare)
  • NT - Steagul de activități imbricat (dacă este setat, acesta indică faptul că codul de executare nu trebuie întrerupt prin multi-tasking , deoarece este o rutină de servicii de întrerupere)
  • PL - Privilegged Level Flag (2 biți) (dacă este setat, permite executarea instrucțiunilor I / O, în cazul în care este resetată, executarea instrucțiunilor I / O generează o excepție de protecție).
  • OF - Overflow Flag (dacă este setat indică faptul că ultima operație aritmetică a generat un overflow )
  • DF - Direction Flag (indică cpu-ului ce direcție să utilizeze în treptele automate ale instrucțiunilor care funcționează pe șiruri .
  • IF - Interrupt Flag (dacă este setat acesta spune cpu pentru a răspunde la întrerupe NMI -. Non Maskable Întrerupere nu este afectat de acest pavilion)
  • TF - Trap Flag (dacă este setat, îi spune procesorului să genereze un INT 0 după fiecare instrucțiune)
  • SF - Semnificație (dacă este setată indică faptul că ultima instrucțiune aritmetică a generat un număr negativ).
  • ZF - Zero Flag (dacă este setat indică faptul că ultima operație logică / aritmetică a generat un 0)
  • AF - Auxiliar Carry Flag (dacă este setat, acesta indică faptul că ultima operație aritmetică a generat un report pe cei 4 biți inferiori de AL, utilizați în aritmetica BCD )
  • PF - Parity Flag (dacă este setat indică faptul că ultima operație aritmetică a generat un rezultat format dintr-un număr impar de biți setat la 1)
  • CF - Carry Flag (dacă este setat indică faptul că ultima operație aritmetică a generat un carry)

Biții rămași nu sunt utilizați și sunt rezervați pentru o utilizare viitoare; valoarea lor nu trebuie modificată și, dacă este citită, nu trebuie luată în considerare.

Registrele SIMD

Pictogramă lupă mgx2.svg Același subiect în detaliu: date multiple cu instrucțiuni unice .

Setul de instrucțiuni MMX , 3DNow! , și SSE au propriile lor registre, pe lângă cele standard IA-32.

Registrele MMX

MMX are 8 registre, numite MM0 până la MM7 (de aici MMn ), care sunt totuși fizic aceleași registre x87 pentru calculul virgulă mobilă FPU , deci este imposibil să utilizați instrucțiunile MMX și virgulă în același timp. înainte de a utiliza setul de instrucțiuni MMX, FPU trebuie dezactivat cu o instrucțiune specifică.

Fiecare dintre registrele MMn conține un număr întreg pe 64 de biți, dar una dintre caracteristicile fundamentale ale acestui set de instrucțiuni este conceptul de vector , format din mai multe date similare: prin urmare ar putea fi stocate două cuvinte de câte 32 de biți, patru din 16 sau opt din 8.

Din nou, deoarece registrele MMn sunt în „coabitare fizică” cu registrele x87, care conțin câte 80 de biți fiecare, în execuția MMX, primii 16 biți ai registrului sunt irosiți: prin urmare, toate sunt setate la 1, astfel încât datele prezentul este recunoscut ca „NaN” sau infinit de către o aplicație în virgulă mobilă, ceea ce face mai ușor să recunoașteți dacă se utilizează date în virgulă mobilă sau MMX.

Înregistrează-te 3DNow!

3DNow! a fost conceput ca o extensie naturală a instrucțiunilor MMX pentru calculul în virgulă mobilă; prin urmare, folosește aceleași nume ca registrele MMn, dar în loc să stocheze cuvinte pe 64 de biți în el, introduce numere cu virgulă mobilă de o singură precizie.

Avantajul utilizării registrelor x87, de asemenea, în acest caz este că acestea sunt deja dedicate calculului în virgulă mobilă și, prin urmare, instrucțiunile x87 pot fi utilizate pentru a efectua operațiuni similare de salvare a registrelor și în codul 3DNow! nu sunt necesare modificări ale sistemului de operare pentru a utiliza această tehnologie.

Registrele SSE

Cu SSE , instrucțiunile SIMD au fost făcute complet independente de registrele x87. Dar aceasta a însemnat, de asemenea, îndepărtarea definitivă de alte seturi de instrucțiuni SIMD, cum ar fi MMX; efort justificat de posibilitatea utilizării unor registre mai mari, libere de limitele punctului plutitor. Au fost create opt registre pe 128 de biți, numite XMM0 până la XMM7 (notă: în arhitectura AMD64 , registrele au fost mărite la 16).

Dezavantajul este că trebuie să introduceți noul set de instrucțiuni în sistemul de operare. Intel a creat apoi o nouă versiune a modului protejat, numită „ Mod îmbunătățit ”, care permite utilizarea instrucțiunilor SSE, dezactivate în modul normal protejat: un sistem de operare care include instrucțiuni SSE accesează noul mod, în timp ce unul mai vechi sau unul care oricum nu le include, va încerca doar să acceseze modul protejat normal.

SSE este un set de instrucțiuni care funcționează numai pe date în virgulă mobilă, cum ar fi 3DNow!, Dar spre deosebire de acesta nu folosește registrele stivei ale FPU, ci propriul său set separat de registre, capabil să conțină de două ori numărul de unități de precizie. În timp ce primul SSE a fost limitat la numere cu precizie simplă, a fost, de asemenea, posibil să se ocupe de numere cu dublă precizie cu SSE2 . Pentru 3DNow! acest lucru nu a fost posibil, deoarece un singur număr din această precizie ar ocupa întregul registru pe 64 de biți, în timp ce registrele XMMn sunt pe 128 de biți: SSE2 este deci mult mai potrivit pentru aplicații științifice decât cei doi predecesori.

Set de instrucțiuni suplimentare SIMD

  • Extensiile MMX au fost prima actualizare majoră: erau instrucțiuni SIMD potrivite numai pentru întregul calcul. Au fost introduse împreună de Intel și AMD în Pentium MMX și K6 în 1997 . A partajat registre cu FPU x87, astfel încât sistemul de operare nu a trebuit să fie modificat pentru a utiliza aceste instrucțiuni dacă a acceptat salvarea stării x87.
  • MMX a fost actualizat cu 3DNow! , care a susținut virgula mobilă , de AMD în 1999 cu K6-2 . Acestea foloseau și registre x87. Intel nu a luat în considerare niciodată această tehnologie.
  • Intel a introdus instrucțiuni SSE , cu suport pentru date cu virgulă mobilă de precizie unică, cu procesorul Pentium III în 1999. Spre deosebire de 3DNow!, Acestea nu erau o extensie a MMX și nu profitau de registrele FPU x87 și necesitau modificări la sistemul de operare să fie exploatat, dar erau liberi de limitările impuse de registrele x87. Aceste instrucțiuni și extensiile sale ulterioare au fost adoptate și de AMD începând cu Athlon XP , iar acest lucru nu a dezvoltat în continuare 3DNow !.
  • SSE2 a fost introdus cu Pentium 4 la începutul anului 2001 ; a fost o îmbunătățire suplimentară a SSE, cu adăugarea de suport pentru numerele cu precizie dublă.
  • SSE3 , introdus cu Pentium 4 Prescott în 2004 , a oferit completări secundare SSE2.

Format de instrucțiuni IA-32

Structura unei instrucțiuni generice IA-32 este variabilă în funcție de opcode-ul specific și poate fi precedată de prefixe (până la patru) care îi modifică comportamentul: o descriere generală este dată în tabelul de mai jos.

Prefixe Instrucțiuni
Instrucțiuni Dimensiunea operandului Dimensiunea adresei înlocuirea segmentului Opcode Mod R / M DA B Schimb Imediat
1 octet 1 octet 1 octet 1 octet 1 sau 2 octeți 1 octet 1 octet 1, 2 sau 4 octeți 1, 2 sau 4 octeți
Opta. Opta. Opta. Opta. OBLIGATORIU Opta. Opta. Opta. Opta.

Octetul Mode R / M specifică suplimentar operandul de instrucțiuni și poate conține un supliment opcode, în timp ce octetul SIB (Scale Index Base) specifică întotdeauna un registru pe 32 de biți (EAX, EBX etc.) și este caracteristic procesorilor IA-32.

Mod octet R / M
Mod Reg / Opcode R / M
2 biți 3 biți 3 biți
Octet SIB
Scări Index Baza
2 biți 3 biți 3 biți

Următorul tabel listează instrucțiunile IA-32, organizate alfabetic în funcție de codul mnemonic al Adunării . Opcpdes hexazecimale și, în cicluri de ceas, sunt raportate, de asemenea, timpii de execuție pentru un 80386. Dacă există un asterisc în locul opcode-ului, acest lucru se datorează faptului că instrucțiunea are multe opcodes diferite în funcție de diferitele forme; chiar și timpii de execuție sunt variabili în funcție de starea în care este situat procesorul: într-un mod protejat, multe accesări la memorie „costă” mai multe cicluri de ceas, iar un posibil comutator de context poate crește foarte mult timpii. Steagurile setate la valorile implicite sunt marcate cu valoarea 0 sau 1 pe care o presupun; dacă sunt modificate în conformitate cu rezultatul operației, acestea sunt marcate cu un asterisc; dacă sunt modificate, dar într-un mod nedefinit sunt marcate cu un semn de întrebare.

Asamblare Opcode (hex) Cicluri de ceas Steaguri schimbate Descriere
AAA 37 4 oditszapc
? ?? *? *
Reglare ASCII după adăugare (pentru aritmetica BCD )
AAD D5 0A 19 oditszapc
? ?? *? *
Reglare ASCII înainte de divizare (pentru aritmetica BCD )
AAM D4 0A 17 oditszapc
? ?? *? *
Reglare ASCII după multiplicare (pentru aritmetica BCD )
AAS 3F 4 oditszapc
? ?? *? *
Reglare ASCII după scădere (pentru aritmetica BCD )
ADC * 2-7 oditszapc
* *****
Adăugați cu carry.
ADĂUGA * 2-7 oditszapc
* *****
Sumă.
ȘI * 2-7 oditszapc
0 **? * 0
Execută AND logic bit între cei doi operanzi, dintre care unul poate fi implicit registrul AL / AX / EAX.
ARPL 63 21 oditszapc
*
Reglarea câmpului RPL al selectorului de segmente. Este utilizat în sistemele de operare pentru a vă asigura că un program nu apelează un subrutină care are un privilegiu mai mare decât programul în sine.
LEGAT 62 10 oditszapc
Verificați dacă operandul se află în anumite limite. Aceasta pentru a evita adresarea accidentală a zonelor din afara unei matrice: de obicei, din motive de eficiență, este utilizată numai în versiunile de depanare ale unui program.
BSF 0F î.Hr. * oditszapc
*
Scanare înainte a biților operaandului.
BSR 0F BD * oditszapc
*
Scanare înapoi a biților operaandului.
BT * 3-12 oditszapc
*
Testarea bitului specificat al operandului
BTC * 6-13 oditszapc
*
Testarea bitului specificat al operandului și negarea acestuia
BTR * 6-13 oditszapc
*
Testați bitul specificat al operandului și setați-l la 0
BTS * 6-13 oditszapc
*
Testați bitul specificat al operandului și setați-l la 1
APEL * 7-98 + oditszapc
toate
Procedură sau apel de subrutină
CBW 98 3 oditszapc
Conversia de la octet la cuvânt
CDQ 99 2 oditszapc
Conversia cuvântului dublu în cuvânt cuadru
CLC F8 2 oditszapc
0
Resetați steagul Carry
CLD FC 2 oditszapc
0
Reducerea la zero a steagului Direcție
CLI FACE 3 oditszapc
0
Resetați semnalizatorul de întrerupere
CLTS 0F 06 5 oditszapc
(nota 1)
Resetați indicatorul de modificare a sarcinii (TS) în registrul special CR0
CMC F5 2 oditszapc
*
Negarea drapelului Carry
CMP * 2-6 oditszapc
* *****
Comparație între doi operanzi
CMPS * * 10 oditszapc
* *****
Comparație între două șiruri de memorie ale căror adrese relative sunt stocate în registrele index SI (sau ESI) și DI (sau EDI): ambele registre sunt decrementate de unul. În funcție de faptul că trebuie luați în considerare octetul, cuvântul sau cuvântul dublu, sunt disponibile variantele CMPS, CMPSB, CMPSW și CMPSD. Foarte des această instrucțiune este utilizată cu prefixele REP * pentru a compara automat întregi zone de memorie.
CWD 99 2 oditszapc
Conversie de la cuvânt la cuvânt dublu
CWDE 98 2 oditszapc
Conversie de la cuvânt la cuvânt dublu
DE LA CATRE 27 4 oditszapc
? *****
Ajustare zecimală după adăugare (pentru aritmetica BCD )
DAS 2F 4 oditszapc
? *****
Ajustare zecimală după scădere (pentru aritmetica BCD )
DEC * 2-6 oditszapc
* ****
Scade operandul specificat cu unul
DIV * 38-41 oditszapc
? ?????
Divizia nesemnată.
INTRODUCE * 10- oditszapc
Crearea cadrului de stivă necesar pentru apelurile de procedură de limbaj la nivel înalt.
HLT F4 5 oditszapc
Opriți procesorul. Nu se execută instrucțiuni noi după un HLT până când apare o întrerupere sau resetare: în cazul unei întreruperi, după rutina de service procesorul reia executarea din instrucțiunea care urmează HLT. De obicei, această instrucțiune este utilizată în scopuri de sincronizare sau de economisire a energiei.
IDIV * 19-43 oditszapc
? ?????
Diviziunea cu semn.
IMUL * 9-41 oditszapc
* ???? *
Înmulțirea cu semn
ÎN * 12+ oditszapc
Citiți un octet sau un cuvânt din portul I / O specificat în operand.
INC * 2-6 oditszapc
* ****
Măriți operandul cu unul.
INS * * 15-29 oditszapc
Citiți un octet sau un cuvânt din portul I / O specificat în șirul specificat din registrul index DI (sau EDI). Adesea folosit cu prefixele REP * pentru a citi automat vectori întregi de date.
INT * 33-119 oditszapc
00
Oprește execuția curentă și execută subrutina de întrerupere specificată de operand.
ÎN EXISTĂ 59-119 oditszapc
Oprește execuția curentă și execută subrutina de întrerupere dedicată deversărilor. Reprezintă INT 4 .
IRET / IRETD CF 22-82 oditszapc
TOATE
Reveniți dintr-un subrutină de întrerupere.
Jcc * 7+ oditszapc
Salt condiționat. Saltul la adresa specificată se efectuează numai dacă anumite stegulețe au o anumită valoare: în caz contrar, execuția continuă normal cu următoarea instrucțiune. Există numeroase tipuri de salturi condiționate.
JMP * 7-49 + oditszapc
Salt la o altă locație. Execuția programului continuă începând de la locația indicată de argumentul jump: dacă argumentul nu indică o instrucțiune validă, se aruncă o excepție și programul se oprește.
LAHF 9F 2 oditszapc
Copiați registrul de semnalizare în registrul AH
LAR 0F 02 16 oditszapc
*
Încarcă octetul drepturilor de acces în descriptorul segmentului. Această instrucțiune este utilizată pentru a seta privilegiile unui anumit segment: este o instrucțiune privilegiată și este utilizată doar de sistemul de operare.
LEA 8 D 2 oditszapc
Se încarcă compensarea adresei reale.
PĂRĂSI C9 4 oditszapc
Ieșiți dintr-o procedură a unui limbaj de nivel înalt: este instrucțiunea simetrică a ENTER și distruge cadrul stivei procedurii terminate.
LGDT 0F 01/2 11 oditszapc
Încărcarea registrului tabelului descriptor global al segmentului: Această instrucțiune este utilizată doar de sistemele de operare, un agent de utilizator nu are niciun motiv să o folosească.
LIDT 0F 01/3 11 oditszapc
Se încarcă registrul tabelului de întrerupere. Acest lucru se face odată pentru totdeauna când porniți din sistemul de operare.
L * S * 7-25 oditszapc
Încărcarea unui segment complet al indicatorului: offset. Diferitele forme ale instrucțiunii (LGS, LFS, LDS, LES, LSS) specifică ce registru de segment va conține partea de segment a indicatorului.
LLDT 0F 00/2 20 oditszapc
Se încarcă registrul tabelului descriptor local. La fel ca toate declarațiile descriptorului de segmente, aceasta este utilizată doar de sistemele de operare.
LMSW 0F 01/6 10-13 oditszapc
Încărcarea cuvântului de stare a mașinii
LODS * * 5 oditszapc
Încărcarea unui operand șir. Operandul indicat de registrul SI (sau ESI) este încărcat în AL / AX / EAX, în funcție de versiunea instrucțiunii utilizate (LODS, LODSB, LODSW, LODSD)
LOOP * * 11+ oditszapc
Salt condițional bazat pe valoarea registrului CX / ECX. După salt, CX / ECX este decrementat cu unul: atunci când registrul este zero, saltul nu mai este efectuat.
LSL 0F 03 20-26 oditszapc
*
Încărcați limita segmentului în descriptorul său, specificat în operand. Este pentru utilizarea exclusivă a sistemului de operare.
LTR 0F 00/3 oditszapc
Încarcă registrul de sarcini cu registrul sau locația de memorie specificată de operand. Această instrucțiune este, de asemenea, privilegiată și utilizată numai de sistemele de operare.
MOV * 2-4 oditszapc
Copiați al doilea operand în primul.
MOVS * * 7 oditszapc
Copiați valoarea curentă într-o anumită poziție a unui șir în poziția corespunzătoare a celui de-al doilea. Este adesea folosit cu prefixele REP *.
MOVSX 0F BE 3-6 oditszapc
Copiază al doilea operand în primul și își extinde semnul.
MOVZX * 3-6 oditszapc
Copiază al doilea operand în primul și șterge restul primului operand.
MUL * 9-41 oditszapc
* ???? *
Înmulțirea nesemnificată a AL sau AX
NEG * 2-6 oditszapc
* *****
Negarea operandului complementului celor doi
NOP 90 3 oditszapc
Fără operație. Sinonim al XCHG AX, AX (vezi).
NU * 2-6 oditszapc
Negarea logică a operandului
SAU * 2-7 oditszapc
0 **? * 0
Logică sau incluzivă a doi operanzi.
OUT * 10-25 oditszapc
Scrierea unui octet sau cuvânt în portul I / O specificat de operand.
OUTS * * 8-28 oditszapc
Scrierea unui octet sau cuvânt al unui șir în portul I / O specificat de operand.
POP * * 5-24 oditszapc
*********
Încărcarea unor registre din stivă . Valoarea indicatorului în partea de sus a stivei, Stack Pointer SP, este diminuată de câte unități au fost citite.
APĂSAȚI * * 2-18 oditszapc
Scrierea în teancul unor registre. Valoarea indicatorului în partea de sus a stivei, Stack Pointer SP, este diminuată cu câte unități au fost scrise.
RCL * 9-10 oditszapc
* *
Rotația stânga a operandului cu carry: toți biții operandului sunt deplasați o poziție spre stânga și valoarea steagului carry este copiată pe cea lăsată liberă, care presupune valoarea bitului care a ieșit din dreapta.
RCR * 9-10 oditszapc
* *
Rotație la dreapta operandului cu carry: toți biții operandului sunt deplasați o poziție spre dreapta și valoarea steagului carry este copiată pe cea lăsată liberă, care presupune valoarea bitului care a ieșit din stânga.
RET * 10-68 oditszapc
Reveniți dintr-o procedură subrutină sau de nivel scăzut.
ROL * 3-7 oditszapc
* *
Rotația stânga a operandului: toți biții operandului sunt deplasați cu o poziție spre stânga, iar cel din stânga este copiat în poziția liberă din dreapta.
ROR * 3-7 oditszapc
* *
Rotația operandului spre dreapta: toți biții operandului sunt deplasați cu o poziție spre dreapta și cel ieșit în extrema dreaptă este copiat în poziția eliberată din stânga.
SAHF 9E 3 oditszapc
*********
Scrierea conținutului AH în registrul steagului.
SAL * 3-7 oditszapc
* **? **
Deplasarea biților operandului de N ori spre stânga: biții care au scăpat din stânga se pierd. Dacă nu se pierd biți, această operațiune este echivalentă cu înmulțirea cu 2 N.
SAR * 3-7 oditszapc
* **? **
Deplasarea biților operandului de N ori spre dreapta: biții care au scăpat din dreapta se pierd. Această operație este echivalentă cu împărțirea la 2 N fără rest.
SBB * 2-7 oditszapc
* *****
Scăderea numărului întreg cu report.
SCAS * * 7 oditszapc
* *****
Comparația șirurilor. Locațiile de memorie indicate de registrele SI și DI (sau ESI și EDI) sunt comparate și cele două registre crescute / decrementate cu unul în funcție de valoarea steagului D. Această instrucțiune este adesea utilizată cu prefixele REP *.
SETcc * 4-5 oditszapc
Setarea octeților în funcție de condiția specificată. În mod similar cu instrucțiunile Jcc, dacă valorile de semnalizare sunt cele impuse de versiunea particulară a SETcc utilizată, valoarea 1 este scrisă în operandul de octeți.
SGDT 0F 01/0 9 oditszapc
Stocarea tabelului descriptor global. Pentru utilizarea și consumul exclusiv al sistemelor de operare.
SHL * 3-7 oditszapc
* **? **
Deplasarea la stânga a biților operandului: bitul care a scăpat din stânga se pierde. Dacă a fost zero, operația este echivalentă cu înmulțirea cu 2.
SHLD * 3-7 oditszapc
? **? **
Deplasarea la stânga a biților operandului în dublă precizie. La fel ca SHL, dar implică și un al doilea registru, legat de primul.
SHR * 3-7 oditszapc
* **? **
Deplasați-vă spre dreapta biților operaandului: se pierde bitul care a scăpat din dreapta. Operația este echivalentă cu împărțirea la 2 fără rest.
SIDT 0F 01/1 9 oditszapc
Stocarea mesei de întrerupere în modul protejat. Pentru utilizarea și consumul exclusiv al sistemelor de operare.
SHRD * 3-7 oditszapc
? **? **
Deplasarea dreaptă a biților operaandului în dublă precizie. La fel ca SHR, dar implică și un al doilea registru, legat de primul.
SLDT 0F 00/0 2 oditszapc
Încarcă registrul tabelului descriptor local. Folosit numai în sistemele de operare.
SMSW 0F 01/4 2-3 oditszapc
Stocarea cuvântului de stare a mașinii
STC F9 2 oditszapc
1
Setați steagul Carry la unul
STD FD 2 oditszapc
1
Setați steagul Direcție la unul
ITS FB 3 oditszapc
1
Setați semnalizatorul de întrerupere la unul
STOS * * 4 oditszapc
Stochează valoarea AL / AX / EAX în poziția unui șir indicat de DI (sau EDI). Apoi valoarea (E) DI este mărită / scăzută în funcție de valoarea steagului D.
STR 0F 00/1 23-27 oditszapc
Stochează jurnalul de sarcini. Util numai pentru sistemele de operare.
SUB * 2-7 oditszapc
* *****
Scăderea numărului întreg.
TEST * 2-5 oditszapc
0 **? * 0
Comparație logică nedistructivă a doi operanzi. Se realizează AND-ul logic între cele două, dar rezultatul nu este stocat: se modifică doar steagurile.
VERR 0F 00/4 10-11 oditszapc
*
Verificarea accesului la citirea unui segment: dacă da, semnalizatorul Zero este setat la 1, altfel este resetat.
VERW 0F 00/5 15-16 oditszapc
*
Verifica di accesso in scrittura di un segmento: se sì, il flag Zero viene posto a 1, altrimenti viene azzerato.
WAIT 9B 6 oditszapc
Il processore si ferma finché il segnale esterno BUSY# (proveniente dal coprocessore matematico) non si disattiva: si usa per sincronizzare i calcoli del coprocessore con quelli della CPU principale.
XCHG * 3-5 oditszapc
Scambia i valori dei due operandi.
XLAT/XLATB D7 5 oditszapc
Trasformazione con tabella di consultazione. Il valore corrente di AL viene sostituito con quello nella cella di memoria della tabella puntata da DS:BX + AL stesso.
XOR * 2-7 oditszapc
0 **?*0
OR logico esclusivo fra due operandi.

Questo è il set completo di istruzioni del processore 80386. La nuova architettura Intel IA-64 non è direttamente compatibile con le istruzioni IA-32.

Voci correlate

  • x86 - Famiglia di processori Intel
  • AMD64 - Architettura a 64 bit di AMD
  • IA-64 - Architettura a 64 bit di Intel per processori Itanium
  • EM64T - Architettura a 64 bit di Intel per processori x86
Informatica Portale Informatica : accedi alle voci di Wikipedia che trattano di informatica