Coding Team, osdev wiki, rajongók powered by Wikia

Az általános formátum a kód szerkesztése

Teljes processzor parancskódot IA-32 architektúra egy sor előtagok (előtagok), a műveleti kódot (műveleti kód), byte MODR / M. SIB byte. mező lehajlás (elmozdulás) az operandus és azonnali (azonnali). Mindezek részei a parancs kód, kivéve a műveleti kód nem kötelező. Összességében parancs kód hossza legfeljebb 15 bájt, és a formátum az ábrán látható.

Összesen processzor parancskódot méret IA-32 architektúra

Regisztráció kódolási szabályok

A processzor parancsok IA-32 architektúra egyidejűleg kódolhatók legfeljebb három regiszterek. Számuk lehet a területeken Reg / Opcode és R / M byte MODR / M, alapindexet és SIB byte mezők, valamint a szám nyilvántartásban, elfoglal bitjeit opkódot bizonyos parancsokat. A 16 és 32 bites módban, ezeken a területeken a hossza 3 bit, amely képes kódolni mindegyikük a nyolc nyilvántartásokban. A 64 bites módban, a rendelkezésre álló nyilvántartások megduplázódik; hozzáférés további regiszterek használatával lehetséges egy előtagot REX, amely egy MSB a számok az egyes a három használt utasítás regiszter (legkevésbé szignifikáns bit továbbra is kódolva a műveleti kód és a bájtok MODR / M és SIB; ha a parancs használ minimális regiszterek száma, megfelelő biteket az előtag REX figyelmen kívül hagyja). További nyilvántartások rendelkezésre 16- és 32-bites módban, mert Rex előtag nem lehet használni.

A következő táblázat mutatja a nyilvántartás hiányában a kódolási REX előtag.

Amint a táblázatból látható, a szegmens regiszterek és MMX regisztrálja MSB kódolt egy előtagot REX, figyelmen kívül hagyja. Ezen túlmenően, a byte regiszterek AH, BH, CH és a DH nem állnak rendelkezésre, ha a csapat egy REX előtagot.

előtagok szerkesztése

IA-32 processzorok felismerik négy csoportba az úgynevezett legacy (legacy) előtagokat. hogy lehet használni a 16-, 32- és 64-bites kódot. Csak egy előtag minden csoportból lehet jelen minden egyes utasítás, a processzor, de reakció, hogy a jelenléte több előtagok egy csoport nincs megadva. Mindegyik előtagot jelenti, hogy csak bizonyos csoportok; következményei egy előtag a csapat, amelyre nem kívánjuk meghatározni. Meglévő processzorok általában figyelmen kívül hagyják előtagok nincs értelme ezzel a csapattal, és ha több van egy csoportban előtagokat csak az utolsó is, de ez nem szabad visszaélni: lehet változtatni a jövőben viselkedését a feldolgozók.

Amellett, hogy a régebbi előtagok a 64 bites kódot REX új előtag lehet használni. A 16 és 32 bites kódot nem áll rendelkezésre.

Jellemzően a sorrendben a előtagok a különböző csoportok nem játszanak szerepet, de ez a szabály alól két kivétel:

  • REX prefix mindig közvetlenül megelőzi a műveleti kód; így örökölte előtagokat kell helyezni előtte;
  • az egyes parancsok bizonyos előtagot kell részt venni a kötelező (de facto részévé válik a műveleti kód, bár de jure is előtag). Ez az előtag kell lennie az utolsó az örökölt előtagokat közte és a tényleges működés kódot lehet elhelyezni csak REX prefix. Például, CVTDQ2PD használati kódolt előtag F3, közvetlenül követi egy kétbájtos műveleti kód: 0F E6.

Legacy előtétek szerkesztése

1. csoport - blokkoló és ismétlés előtagokat:

  • F0h - LOCK busz zár előtag;
  • F2H - ismétlés előtag REPNE / REPNZ;
  • F3H - ismételt előtag REP vagy Repe / REPZ.

Ismételje előtagokat csak string műveletek CMPS. INS. Lods. MOV. OUTS. SCAS. STOS. Ezen kívül néhány más csapatok, az kötelező, valójában részévé válik a műveleti kód és elvesztette eredeti jelentését.

Megjegyezzük, hogy a cég dokumentációja AMD ismétlés és zár előtagokat különböző csoportokba sorolják, ezért úgy gondoljuk, hogy öt csoportját előtagokat. Azonban, ezek a előtagok nem lehet együtt használni, így azok elegyítése egyetlen csoport megfelelő.

2. csoport - előtétek szegmens cseréje és optimalizálása átmenetek:

  • 2EH - helyett az előtag CS szegmens: vagy egy valószínűtlen átmenetet;
  • 36H - előtag SS :;
  • 3Eh - prefix DS: vagy valószínű átmeneti;
  • 26H - előtag ES :;
  • 64h - előtag FS :;
  • 65h - prefix GS:.

A 64-bites módban, a szegmens DS helyett előtagokat:. ES:. CS: és SS: figyelmen kívül hagyja, és a fennmaradó két különleges módon: a szegmens regiszterek FS és a GS azokat használó alkalmazunk további bázis regiszterek.

Az utasítások megy jelenlétében helyettesítő szegmens előtag általában vezet kiszámíthatatlan eredményeket. A gyakorlatban azonban ezek előtagokat figyelmen kívül hagyja, és az utolsó változata a processzor, közülük kettő (DS: az SS :) már használják a „hint”, hogy a processzor tekintetében az átmenet valószínűsége egyik vagy másik ága. Most ez a két előtagokat hivatalosan támogatott minden feltételes ugró utasítások.

3. csoport - 66h prefix megváltoztatja az operandus mérete.

Ha a jelenlegi kód szegmens alapértelmezett adat mérete 16 bit, akkor a jelenléte ezt a prefix hatására a parancs végre nem 16 és 32 bites operációs; ha az alapértelmezett adat mérete 32 bit, akkor a jelenléte az előtag parancs nem 32-, és 16-bites működést. A bájt feldolgozása parancsok előtag figyelmen kívül hagyja.

A 64-bites módban, az alapértelmezett adat mérete 32 bit, és a használata az előtag 66h lehetővé kezelni a 16 bites adatokat. 64-bites operandusokat, kivéve néhány parancsok csak jelenlétében REX prefix bit készlet W; 66h előtag figyelmen kívül hagyja ezt a helyzetet.

Prefix operandus átméretezés programozó nem kifejezetten a fordítóprogram határozza szükségesnek.

Ez az előtag programozó nem kifejezetten adja meg: a fordító teszi, hogy maga, ha szükséges.

REX prefix szerkesztése

REX prefix csak akkor használható a 64 bites kódot, és található közvetlenül a műtét előtt kódot, elvégre örökölt előtagokat. Szükség van az alábbi esetekben:

  • amikor egy új utasítást használ regiszterek lépett együtt a 64 bites kiterjesztés IA-32 architektúra (lásd „Coding nyilvántartások” részben fölött található.);
  • amikor a csapat használ 64 bites operandus.

Ha a REX prefix használják a parancsot, amelyhez ez haszontalan, azt figyelmen kívül hagyjuk.

Nagy majszol REX prefix mindig tartalmazza 0100 bit; így, a REX előtag lehet 40H-4Fh kódokat. A 16 és 32 bites módban, hogy ezek a kódok megfelelnek az egy byte-os utasításokat INC és december így 64 bites módban nem állnak rendelkezésre. Ehelyett a végrehajtásához ugyanazt a funkciót, a formák INC és december utasításokat. használatával bájt MODR / M (műveleti kód FF / 0 és az FF / 1).

Alsó nibble REX előtag áll négy bit, amelyek mindegyike egy funkciót:

  • bites W (3) részt vesz a meghatározása a méret a operandusok. Amikor ez 0, és 66h megváltoztatja az operandus mérete előtag hiányzik, a méret a operandus egyenlő 32 bit; bit nulla és W jelenlétében 66h előtag amely 16 bites operandusokat; ha W = 1 mérete operandus 64 bit, függetlenül egy előtag 66h. Feldolgozásra 8-bites operandusokat külön műveleti kódokat biztosítanak; Ebben az esetben, bit W és 66h előtag figyelmen kívül hagyja.
  • bitek R (2) - kisülési mező kiterjed Reg / Opcode bájt MODR / M elérni az új, általános célú regiszterek, SSE, kezelése és hibakeresés;
  • bites X (1) - kisülés van Index SIB bájtos mező eléréséhez egy új, általános célú regiszterek;
  • B bit (0) - mentesítés, kiterjesztve a mező R / M bájt MODR / M, Base Field SIB byte-nyilvántartási szám vagy mező található byte műveleti kód, hogy elérhessük az új regiszterek.

Opcode szerkesztése

A műveleti kód az egyetlen kötelező mező minden csapat. Ez hossza 1-3 bájt. A két- és parancsok trohbaytovyh első byte összeadás 0Fh. Ezen kívül néhány parancsok megkövetelik a kötelező jelenléte F2H prefix, F3H vagy 66h, ami kell elhelyezni, hogy közvetlenül előtte a műveleti kód (az ilyen kötelező prefix, valójában elvesztette eredeti funkcióját, és légy része a műveleti kód és a tényleges kódot, mielőtt a művelet lehet csak egy előtaggal REX ).

Néhány parancs alkalmazásával csak egy explicit operandus része a művelet kódot tartalmazott a szakterületen trohbitovom Reg / Opcode bájt MODR / M (dvuhoperandnyh parancsokat ez a mező száma a regiszter használható második operandus). Intel dokumentációt ebben az esetben ezek a bitek értékét mutatja egy számjegy után Törtvonal követő műveleti kódot byte értékét. Például, a parancs műveleti kódok megfelelnek INC FE / 0 és FF / 0; valójában opkód byte kell állítani FEh és FFh, és a mező Reg / Opcode követő műveleti kód byte MODR / M - 000.

Bizonyos parancsok, néhány műveleti kód bitet használunk, hogy meghatározzuk a regiszterek száma használni. Például, a 16 és 32-bites kódot az általános célú regiszter növekmény szó vagy dupla szavas hosszúságú lehet használni egybájtos parancsot INC kiviteli alakban. amelynek műveleti kód a 40h és 47h, befogadó, ahol az alsó három bit határozza meg a nyilvántartás; Byte MODR / M nem kell ezt az opciót. A 64-bites módban egy ilyen kiviteli alak INC parancs nem használható, mert ez a tartomány kódok kiosztott REX prefix.

Byte MODR / M szerkesztése

A legtöbb adatot feldolgozó utasításokat, és számos más csapatok explicit operandusok, melyek által kódolt byte. Amellett, hogy ez, hogy meghatározzák a helyét a operandusokat lehet használni SIB byte és egy mezőt alakváltozás, és egy 64-bites kódot - és még REX előtag. Néhány parancs, operandust meghatározott implicit kódolt vagy több bit a műveleti kód byte; Vannak olyan utasítások is, az egyik operandus hogy egy állandó található a közvetlen operandus. Egyes esetekben, vannak „párhuzamos” változata azonos utasítások: például, növeljük az tartalmát regiszter 16 és 32-bites módban lehetséges akár használatával egybájtos utasítás (műveleti kódot a 40h a 47h, sőt az alsó három bit kijelöli a nyilvántartás) vagy pedig egy kétbájtos (bájt műveleti kód egyenlő FFh, és byte MODR / M értéke C0h hogy C7-H; az alsó három bit - mező R / M - pont regiszter).

Amikor Mod mező 11, az operandus tárolt bármely regiszter. Regisztráció szabványnak, és mindig le ugyanabban a fenti szakaszt.

Mivel a 16-bites módban, Mod = 11 tárolt operandus nyilvántartásban; regiszterek kódolási szabályok a fent megadott, a megfelelő szakasz.

Ha Mod = 01, vagy 00, és R / M = 101, azaz, memória-hozzáférés viszonylag EBP regiszterek, alapértelmezett hozzáférési végzünk, hogy a verem szegmens, és más kombinációkban és Mod R / M (kivéve Mod = 11 vagy R / M = 100) -, hogy egy adatszegmens. Vissza lehet nyúlni, hogy bármely más szegmense, amelyet akkor kell használni helyett az előtag szegmens.

A 64 bites módban a következő tulajdonságokkal rendelkezik:

Byte SIB szerkesztése

SIB byte van osztva három területen: a két-bites skála és trohbitovye Index és a Base. található egy byte ebben a sorrendben.

Skála mutatja az index skála:

Ott Disp - eltérés, amelynek jelenléte meghatározzuk, és bit bájt MODR / M, és az érték a byte-kód utasítások után SIB; Base - tartalmát a bázis regiszter, amelynek száma szerepel az azonos nevű mező byte SIB; Index - index regiszter tartalma, melynek száma szerepel az azonos nevű mező byte SIB; Scale - mérettényezővel az index, ami bele van kódolva a névadó területén SIB byte.

Oszlop értéke „*” megfelel a második a fenti kivételek EBP regiszter, amelynek kapacitása használni, mint az alap függ mező értéke Mod bájt MODR / M.

  • a REX prefix bites bázis és index mezők növeli, lehetővé téve isoplzovat bázisként és az index további nyolc regiszterek R8 / R8D-R15 / R15D. Amikor az Index SIB bájt 100 tartalmaz, és a bit X REX előtag nulla, az indexregiszter hiányzik (azaz, mint a 32-bites módban, RSP / ESP regisztrálja nem jár, mint egy index). Amikor Index = 100, és REX.X = 1, használunk indexként regisztrálja R12 / R12D;
  • Regisztráció RBP / EBP még mindig nem lehet használni, mint a bázis nélkül kifejezett elutasítás. Továbbá, SIB byte nem kódolnak lehetővé teszi a használatát R13 / R13d regisztrálja, mint a bázis nélkül kifejezetten meghatározott változása, mint a 00 és Mod = Bázis = 101 kell tekinteni, hogy a bázisregiszter nem, állapotától függetlenül a bitek B REX előtag.

eltérés szerkesztése

Azonnali operandus szerkesztése

  • ha az operandus mérete 8, 16 vagy 32 bit, a méret a közvetlen operandus mező megegyezik a méret az operandus;
  • ha az operandus 64 bit (jelen REX prefix bit készlet W), majd a MOV reg64, const (műveleti kódokat B8h-BFH), egy 32-bites mező közvetlen operandus, közvetlen magát operandus tekinthető a számot jel és a műtét előtt bővül 64 bit;
  • utasítások a MOV reg64, const (műveleti kódokat B8h-BFH c előtag REX, amelynek egyetlen bit W) egy 64-bites azonnali művelet tárgya mezőt.
  • Megállapította használata AdBlock kiterjesztés.

    Kapcsolódó cikkek