Může mi někdo vysvětlit tento přímo sestavenou x86 JMP opcode?

hlasů
8

Ve škole jsme používali zaváděcí program spustit samostatné programy bez operačního systému. Byl jsem studovat tento program a při jištění je povolen režim je mnohem skok prováděný přímo sestavením operační kód a operandy jako data v rámci programu. To bylo pro GNU assembleru:


         /* this code immediately follows the setting of the PE flag in CR0 */

.byte   0x66, 0xEA
.long   TARGET_ADDRESS
.word   0x0010          /* descriptor #2, GDT, RPL=0 */

Za prvé, proč by někdo chtěl, aby to (namísto instrukce mnemotechnická pomůcka)?

Hledala jsem v manuálech Intel, ale jsem pořád trochu zmatená kódem. Konkrétně ve svazku 2A, strana 3-549, tam je tabulka opcodes. Příslušný záznam:

EA * cp * JMP ptr16: 32 Inv. Platný skok daleký, absolutní adresu uvedenou v
operand

Samotný operační kód je zřejmá, ale první bajt, 0x66, má mě splést. S odvoláním na tabulku v manuálu Intel je cp zřejmě znamená, že 6 byte operand bude následovat. A samozřejmě 6 bajtů následovat v příštích dvou řádcích. 0x66 kóduje ‚operand velikosti potlačení předponu‘. Co to má co do činění s cp v tabulce? Byl jsem tam čekal, že některé hex hodnota cp, ale místo toho je toto potlačení prefix. Může mi někdo prosím, zrušte to pro mě?

Zde je skládka od OD:

C022 ** ea66 0000 0001 0010 ** ba52 03f2 C030

TARGET_ADDRESS byla definována jako 0x00010000.

Jsem také zmatený trochu podle významu v posledních dvou bajtů. Nicméně, která se zdá být jiná otázka úplně. To je stále poměrně pozdě, a já jsem se díval na kódu a manuálech Intel celé hodiny, takže doufám, že jsem dostal místo v celé.

Díky za hledáte!

Položena 13/02/2009 v 08:49
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
12

0x66 znamená, že JMP (0xEA) se odkazuje na šest bajtů. Výchozí odkazem na 64K (16 bitů) v reálném režimu nebo až 32 bitů v chráněném režimu (pokud si dobře vzpomínám dobře). S se zvýšila, ale také zahrnuje segment deskriptor, index segmentu buď v GDT nebo LDT, což znamená, že tento kód je dělat to, co se obvykle nazývá „dlouhý skok“: skok, který kříž nad segmenty v x86 architekturu. Segment, v tomto případě poukazuje na druhém vstupu na GDT. Podíváte-li se dříve v tomto programu, budete pravděpodobně vidět, jak se GDT je ​​definován v podmínkách segmentu výchozí adresu a délku (podívejte se do manuálu Intel studovat GDT a LDT tabulek, 32 bit vstup popisující každý segment).

Odpovězeno 13/02/2009 v 08:59
zdroj uživatelem

hlasů
2

Běžím do této chvíli. Některé montéři bude skákat pouze na etiketě. V tomto případě se člověk chce, aby se absolutní skok na určitý pevný kódované kompenzovat. JMP TARGET_ADDRESS nebude fungovat, jsem hádat, takže stačí dát ho jako bajty, jak obejít tento problém.

Odpovězeno 14/05/2009 v 17:58
zdroj uživatelem

hlasů
0

0x66 udává operand velikosti potlačení aktuální velikost kódu segmentu. Za předpokladu, že současná velikost kódu je 16-bit, bude nová instrukce ukazatel být 32-bit, není 16-bit. Pokud je aktuální velikost segment kódu je 32-bit, bude 0x66 vykreslení cílové instrukce ukazatel jako 16-bit. Současný atribut velikost kódu závisí na voliče CS v provozu a jeho atributy načítány z GDT / LDT tabulky. V reálném režimu je velikost kódu segmentu je obvykle 16-bit s výjimkou zvláštních případů „neskutečné“ režimu.

Odpovězeno 19/08/2014 v 09:58
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more