Formatul general al codului Edit
Procesorul complet codul de comandă arhitectura IA-32 constă dintr-un set de prefixe (prefixe), codul de operare (opcode), octet ModR / M. SIB octet. Deformarea câmpului (deplasare) a operandului și imediat (imediat). Toate aceste părți ale codului de comandă, cu excepția codului de operare sunt opționale. Lungimea totală de cod de comandă este limitată la 15 bytes, iar formatul este prezentat în figură.
Format total procesor de cod de comandă arhitectura IA-32
înregistrare reguli de codare
Comenzile Procesorul IA-32 arhitectura pot fi codificate simultan până la trei registre. Numărul acestora poate fi în câmpurile Reg / Opcode și R / M byte ModR / M, indicele de bază și câmpuri octet SIB, precum și în registrul de număr, ocupând biți semnificativi opcode în unele comenzi. Modurile 16- și 32-bit, aceste domenii au o lungime de 3 biți, care poate codifica fiecare dintre ele unul din cele opt registre. În modul pe 64 de biți, numărul de registre disponibile este dublat; accesul la registre suplimentare, este posibilă utilizarea unui prefix REX, conținând un MSB pentru numere din fiecare din cele trei utilizate în registrul de instrucțiuni (cel ce biți semnificativi sunt încă codificate în Opcode și bytes ModR / M și SIB, în cazul în care comanda utilizează un număr minim de registre, biții corespunzători din prefixul REX ignorate). nu pot fi utilizate registre suplimentare disponibile în 16- și 32-biți moduri, cum rex prefix.
Tabelul de mai jos prezintă registrul în absența codare REX prefix.
După cum se vede din tabel, pentru registrele de segment și MMX înregistrează MSB codificat într-un prefix REX, este ignorat. În plus, octetul înregistrează AH, BH, CH și DH nu sunt disponibile în cazul în care echipa are un prefix REX.
prefixe Editare
IA-32 procesoare recunosc patru grupuri de așa-numita moștenire (moștenire) prefixe. care poate fi utilizat în codul 16-, 32- și 64-biți. Doar un singur prefix din fiecare grup poate fi prezentă în fiecare instrucțiune, procesorul dar reacția la prezența mai multor prefixe ale unui grup nu este specificat. Fiecare prefix are sens numai pentru anumite echipe; consecințele utilizării unui prefix cu echipa pentru care nu este destinat să fie determinată. procesoare existente ignora, de obicei, prefixe care nu au sens cu aceasta echipa, iar în cazul în care există mai multe prefixe un grup folosit doar ultimul dintre ele, dar acest lucru nu ar trebui să fie abuzat: se poate schimba în comportamentul viitor al procesoarelor.
În plus față de prefixe moștenite din cod pe 64 de biți REX noul prefix poate fi utilizat. Codul de 16- și 32-biți nu este disponibilă.
De obicei, ordinea prefixele din diferite grupuri nu joacă un rol, dar această regulă are două excepții:
- REX prefix întotdeauna precede imediat Opcode; astfel moștenită prefixele trebuie să fie plasat în fața lui;
- în unele comenzi pentru anumite prefix trebuie să participe la un obligatoriu (de facto, aceasta devine parte a codului de operare, cu toate că de jure rămâne prefix). Acest prefix trebuie să fie ultima dintre prefixele moștenite între acesta și codul de funcționare real poate fi plasat numai REX prefix. De exemplu, instrucțiuni CVTDQ2PD prefix codat F3, urmat imediat de un opcod doi octeți: 0F E6.
Legacy prefixele Editare
Grupul 1 - blocarea și repetarea prefixe:
- F0h - blocare autobuz prefix;
- F2H - repetiție prefix REPNE / REPNZ;
- F3H - o repetare REP prefix sau REPE / REPZ.
prefixe repetate sunt utilizate numai cu CMPS operațiuni șir. INS. LOD. MOVs. ODIHNA. SCAS. Observatorii pe termen scurt. În plus, unele alte echipe, ele sunt obligatorii, de fapt, devenind o parte din codul de operare și care au pierdut sensul său original.
Rețineți că, în documentația AMD repetarea companiei și prefixe de blocare atribuite diferitelor grupuri, astfel încât se crede că cinci grupe de prefixe. Cu toate acestea, aceste prefixe nu pot fi utilizate împreună, astfel încât combinarea acestora într-un singur grup este adecvată.
Grupul 2 - prefixele de înlocuire și optimizarea tranzițiilor segmentului:
- 2EH - înlocuirea prefixul CS segment: sau o tranziție improbabilă;
- 36h - prefix SS :;
- 3Eh - DS: prefix sau tranziție probabilă;
- 26h - prefix ES :;
- 64h - prefix FS :;
- GS prefix - 65h.
În modul pe 64 de biți, segmentul DS înlocuind prefixe:. ES:. CS: și SS: ignorat, iar celelalte două sunt mod special: FS registre segment și GS și utilizarea lor sunt folosite ca registre de bază suplimentare.
Instrucțiunile merg prezența de înlocuire prefixului segmentului conduce în general la rezultate imprevizibile. În practică, cu toate acestea, aceste prefixe sunt ignorate, iar în ultima versiune a procesorului, două dintre ele (DS: și SS :) au fost folosite ca un „indiciu“, a procesorului în ceea ce privește probabilitatea de tranziție de una sau alta ramură. Acum, aceste două prefixe sunt susținute în mod oficial toate instrucțiunile de salt condiționat.
Grupul 3 - 66h prefix modifică dimensiunea operandului.
În cazul în care segmentul de cod de dimensiunea curentă prestabilită a datelor este de 16 biți, atunci prezența acestui prefix determină comanda pentru a efectua nu 16-, și operare pe 32 de biți; în cazul în care dimensiunea prestabilită a datelor este de 32 de biți, atunci prezența acestei comenzi prefix nu va 32-, și operare pe 16 biți. Procesarea comenzilor octeți prefix este ignorat.
În modul pe 64 de biți, dimensiunea prestabilită a datelor este de 32 de biți, iar utilizarea prefixului 66h permite ocupe de date de 16 biți. operanzi pe 64 de biți, cu excepția câtorva comenzi sunt folosite numai în prezența REX prefix de biți set W; prefix 66h este ignorat în această situație.
Prefixul programator operand Redimensionarea nu este menționat în mod explicit, compilatorul determină necesar.
Acest programator prefix nu dat în mod explicit de: traducător pune el însuși, dacă este necesar.
REX prefix Editare
REX prefix poate fi utilizat numai în cod pe 64 de biți și este situat imediat înainte de codul de operare, după toate prefixe moștenite. Este necesar în următoarele cazuri:
- atunci când o nouă instrucțiune utilizează registre introduse împreună cu extensia 64-biți IA-32 arhitectura (a se vedea „codificare a registrelor“ secțiunea situată mai sus.);
- atunci când echipa juca un operanzi pe 64 de biți.
În cazul în care prefixul REX este utilizat în comanda la care este inutil, este ignorat.
Înaltul ciuguli REX prefix conține întotdeauna 0100 biți; Astfel, prefixul REX poate avea o coduri 40h-4Fh. Modurile de 16- și 32-biți la aceste coduri corespund instrucțiunilor octet INC și decembrie astfel încât în modul pe 64 de biți nu sunt disponibile. În schimb, pentru punerea în aplicare a acelorași funcții, formele instrucțiuni INC și DEC. folosind bytes ModR / M (opcode FF / 0 și FF / 1).
ciugulitură inferior REX Prefix este format din patru biți, fiecare dintre care are o funcție:
- bit W (3) participă la determinarea mărimii operanzilor. Când este 0, și 66h schimbă prefixul dimensiune operanzi este absent, dimensiunea operanzilor este egală cu 32 de biți; bit la W prezență 66h prefix zero și utilizează operanzi de 16 biți; când W = 1 dimensiune operanzi este de 64 de biți, indiferent de un prefix 66h. Pentru prelucrare operanzi 8 biți sunt furnizate Opcodes distincte; În acest caz, bit W și prefixul 66h este ignorat.
- biți R (2) - câmp de descărcare se extinde Reg / Opcode byte ModR / M pentru a avea acces la noile registre, de uz general, SSE, gestionarea și depanare;
- bit X (1) - descărcare se extinde câmpul octet Index SIB pentru accesarea unei noi registre de uz general;
- bit B (0) - descărcare, extinderea câmpului R / M byte ModR / M, Base Câmpul SIB număr registru octet sau un câmp situat în opcode octet, pentru a avea acces la noile registre.
opcode Editare
Codul de funcționare este singurul câmp obligatoriu orice echipă. Are o lungime de la 1 la 3 octeți. În două și comenzile trohbaytovyh primul octet opcode este 0Fh. În plus, unele comenzi necesită prezența obligatorie a prefix F2H, F3H sau 66h, care ar trebui să fie plasate direct în fața codului de operare (între un astfel de prefix obligatoriu, a pierdut de fapt, funcția lor inițială și să devină o parte a codului de operare și codul actual înainte de operație poate fi doar un prefix REX ).
Unele comenzi folosind doar o parte operanzi explicită a codului operare conținut în câmpul trohbitovom Reg / Opcode byte ModR / M (comenzi dvuhoperandnyh în acest câmp conține numărul registrului utilizat ca al doilea operand). documentație Intel, în astfel de cazuri, acești biți indică valoarea unei singure cifre după semnul slash după valoarea opcode octet. De exemplu, codurile de operare de comandă corespund INC FE / 0 și FF / 0; de fapt, octet opcode se stabilește la FEH și FFh, și câmpul Reg / Opcode după Opcode octet ModR / M - 000.
In unele comenzi, unele biți OpCode sunt folosite pentru a determina numărul de registre utilizate. De exemplu, în codul 16- și 32-biți pentru uz general cuvântul registru creștere sau lungimea cuvânt dublu poate fi utilizat de un octet comandă INC întruchipare. având un opcode de 40h la 47h, inclusiv, în cazul în care cele mai mici trei biți specificați registru; Byte ModR / M nu are nevoie de această opțiune. În modul 64-biți o astfel de variantă de comandă INC nu poate fi utilizat, deoarece codurile din gama alocat pentru REX prefix.
Byte ModR / M Editare
Cele mai multe date instrucțiuni și o serie de alte echipe de prelucrare folosesc operanzi explicite, care sunt codificate de aceste octet. În plus față de aceasta, pentru a determina locațiile operanzilor pot fi utilizate SIB octet și o deviere câmp, și un cod pe 64 de biți - și chiar prefixul REX. Unele comenzi, operanzi sunt specificate în mod implicit codificate sau mai mulți biți ai octetului Opcode; Există, de asemenea, instrucțiuni, un operand, care este o constantă este situat în imediata operand. În unele cazuri, există „paralele“ versiune aceleași instrucțiuni: de exemplu, incrementa conținutul registrului 16 și modurile de 32 biți este posibil, fie prin utilizarea de instrucțiuni cu un singur octet (opcode de 40h la 47h, în plus sale mai mici de trei biți desemnează registrul) sau prin utilizarea unui dublu-octet (opcode octet egal cu FFh și byte ModR / M cu valoarea C0h la C7h; scăzuți trei biți - câmpul R / M - se utilizează punctul de registru).
Când câmpul Mod este 11, operand stocate în orice registru. registru standardul de codificare și descrise întotdeauna în aceeași secțiune de mai sus.
Ca și în modul 16 biți, Mod = 11 stocat în registrul operanzi; Registrele normele menționate mai sus, în secțiunea corespunzătoare de codificare.
Dacă Mod = 01 sau 00, și R / M = 101, adică, acces la memorie registre relativ EBP, accesul implicit se realizează la segmentul stivă și în alte combinații și Mod R / M (cu excepția Mod = 11 sau R / M = 100) - la un segment de date. Recurgerea la orice alt segment, care trebuie utilizat înlocuirea segmentului prefix.
În 64-biți modul are următoarele caracteristici:
Byte SIB Editare
SIB octet este împărțit în trei domenii: doi biți Scale și trohbitovye Index și bază. situat într-un octet în această ordine.
Scala indică o scală de index:
Acolo Disp - deviere, a cărei prezență este determinată și bit octet ModR / M, iar valoarea este în codul byte comenzi după SIB; Base - conținutul registrului de bază al cărui număr este dat același câmp numele octetul SIB; Index - conținutul registrului de index, al cărui număr este dat același câmp numele octetul SIB; Scala - factor de scalare pentru indicele, care este codificat în câmpul omonim octetul SIB.
Coloana cu o valoare de „*“ corespunde cu cea de a doua dintre excepțiile de mai sus registrul EBP a căror capacitate de a utiliza ca bază depinde de valoarea câmpului octetul Mod ModR / M.
- folosind câmpurile bit prefix de bază și indicele REX crește, permițând isoplzovat ca bază și index suplimentare opt registre R8 / R8d-R15 / R15D. Când în octetul Index SIB 100 conține și bit X REX prefixul este zero, registrul index este absent (adică, ca și în modul pe 32 de biți, RSP / ESP registru nu poate acționa ca un index). Atunci când este utilizat Index = 100, iar REX.X = 1 ca un index registru R12 / R12D;
- Register PFR / EBP încă nu pot fi utilizate ca bază, fără o respingere explicită. In plus, SIB byte nu este codificării permite utilizarea R13 / R13D înregistrați ca o bază fără variații predeterminate în mod explicit ca la 00 și Mod = Baza = 101 este considerat a fi că registrul de bază nu, indiferent de biți de stare B REX prefix.
abaterea Editare
Imediat operand Editare
- dacă dimensiunea operanzi este 8, 16 sau 32 de biți, dimensiunea câmpului operanzi imediată este egală cu dimensiunea operandului;
- în cazul în care operandul este de 64 de biți (prezent REX bit prefix set W), apoi toate instrucțiunile, cu excepția reg64 MOV, const (Opcodes B8h-BFH), un 32-bit câmp operand imediat, cu operand in sine direct este considerată ca număr cu marca și înainte de operație este extinsă la 64 de biți;
- instrucțiuni în reg64 MOV, const (opcodes B8h-BFH c prefix REX, având un singur bit W) folosind un câmp operand imediat pe 64 de biți.