Black friday Black friday
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Pouze tento týden slevy až 80 % na programování v Javě

Lekce 3 - Assembler x86 a x64 - Registry

Ostatní jazyky Assembler Assembler x86 a x64 - Registry

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Assembler x86 a x64 - Seznámení a nastavení, jsme se věnovali nastavení EasyCode. V dnešním ASM tutoriálu budeme pokračovat a uvedeme si popis registrů, které můžeme využívat pro programování v x86.

Konfigurace EasyCode

Karta Configurations je nejdůležitější částí celého nastavení, neboť všechny konfigurace sestav jsou správně nastaveny, aby fungovaly bezchybně. Konfiguračním polem zvolíme konfiguraci určenou ke kontrole nebo modifikovaní. Jakmile je vybrána konfigurace, můžeme zvolit kódování textu. ANSI je výchozí hodnota kódování (doporučeno) a nemá žádný vliv na editor kódu, který vždy pracuje v režimu Unicode. Můžete si ale vybrat jinou metodu kódování, pokud se vám líbí, pokud je podporována odpovídajícím překladačem. V opačném případě budou při kompilaci zdrojového kódu vyvolány chyby a projekt nebude vytvořen.

Na druhou stranu je zde deset skupin různých barev, na kterých můžete přidávat nebo odstraňovat klíčová slova (klíčová slova, která jsou ve výchozím nastavení dostupná, a jsou podporovaná kompilátorem, který je na ně konfigurován). Klíčová slova budou zvýrazněna barvou dané skupiny. Samozřejmě můžete barvu jednotlivých skupin změnit.

Nyní musíte specifikovat správné cesty pro konfigurátor assembleru. Pokud je načten nějaký projekt, zavřete jej, pak klikněte na tlačítko Paths and command line options a zobrazí se následující okno:

Konfigurace cesty pro konfigurátor assembleru

Doporučuje se, abyste při nastavování cest a možností příkazového řádku zobrazených v předchozím okně neměli žádný projekt načtený. Nastavení správných cest je nezbytným krokem k tomu, aby bylo možné sestavovat projekty snadno a bez chyb.

Nastavení Easy Code pro 32 bitů - Začínáme

Ukážeme si rozdíl natavení pro 32 bitů a 64 bitů, pouze rozdíly:

EasyCode32_1

Stránka vlastností

EasyCode32_2

Options

EasyCode32_3

Nastavení konfigurace

EasyCode32_4

Cesty k souborům

Jaké registry budeme používat pro programy x86

Podrobný popis těchto registrů a instrukcí je popsán v těchto článcích: Michal Brandejs - Mikroprocesory Intel – Pentium, Assembler X86 - Ing. Petr Olivka, Ph.D., Instrukce MMX - Martin Horák, Michal Zamazal, Lukáš Džbánek, Martin Švirák

Níže následuje výňatek z těchto článků.

Registry32
  • Mezi všeobecné registry patří tyto: EAX, EBX, ECX, EDX, EBP, ESP, ESI a EDI. Do všech těchto registrů lze ukládat výsledky a operandy pro aritmetické a logické operace. Rovněž je lze použít i pro adresové výpočty vyjma registru ESP, který nelze použít pro indexaci.
  • Registry ESP, EBP, ESI a EDI se zpravidla používají pro uložení offsetu. Registr ESP (Stack Pointer) obsahuje offset adresy vrcholu zásobníku. Kompletní adresa vrcholu zásobníku je SS:ESP
  • Registr EBP (Base Pointer) je určen převážně pro uložení offsetové části adresy při práci se zásobníkem. Nejčastěji se používá pro adresaci operandů předávaných do podprogramu prostřednictvím zásobníku.
  • Registry ESI a EDI jsou tzv. indexové registry. ESI (Source Index) je indexový registr pro uložení offsetové části adresy zdrojového operandu a EDI (Destination Index) cílového operandu. Toto přesně definované určení indexových registrů je nutné dodržet v instrukcích pracujících s řetězci. Jinak registry EBP, ESI a EDI patří do skupiny všeobecných registrů. Postavení registru ESP je výsadní (viz instrukce PUSH a POP).
  • Příznakový registr EFLAGS (Flags) obsahuje dvě skupiny jednobitových informačních příznaků. První skupina (CF, PF, AF, ZF, SF, OF) jsou příznaky nastavované procesorem po provedení instrukce.
  • Registr EIP (Instruction Pointer) obsahuje vždy offsetovou část právě prováděné instrukce. Kompletní adresa právě prováděné instrukce je v registrech CS.
  • Základním registrem pro řízení procesoru je registr CR0. Tímto registrem se mj. zapíná a vypíná chráněný režim procesoru a stránkování.
  • Registr CR2, je-li nastaven bit PG v CR0, obsahuje lineární adresu, která způsobila výpadek stránky detekovaný stránkovací jednotkou.
  • Registr CR3 je rovněž využit pouze při zapnuté stránkovací jednotce. Obsahuje fyzickou adresu stránkového adresáře právě aktivního procesu.
  • Registr CR4 využíván pro řízení procesoru. Zaveden až pro procesor Pentium.
  • Registry DR0, DR1, DR2, DR3, DR6 a DR7 pro sledování a ladění.
  • Registr CS se používá se pro adresaci instrukčních segmentů.
  • Registr DS ve spojení s všeobecnými registry adresuje data.
  • Registr ES je pomocný datový segmentový registr.
  • Registr FS je pomocný datový segmentový registr.
  • Registr GS je pomocný datový segmentový registr.
  • Registr SS adresuje zásobník ve spojení s registry ESP a EBP.
  • Registr MMX je technika zvaná SIMD, tzn. více informací může být zpracováno jedinou instrukcí. Toto spolu s možností paralelního zpracování dává MMX vysokou výkonnost. MMX je implementováno do Intel Architektury a je plně kompatibilní pod všemi operačními systémy (MS-DOS, Windows 3.1, Windows 95 a výše, OS/2 a Unix).
  • FPU obsahuje 8 datových registrů, které jsou 80bitové, a tři 16bitové pomocné registry: řídicí, stavový a doplňující. Datové registry umožňují uložení čísla v libovolném formátu. Vrácená hodnota je v registru ST0. Řídicí registr, jehož tvar je na obr. 3.2, nastavuje některé parametry pro výpočty v FPU. Stavový registr obsahuje stav FPU. Rovněž je v něm zaznamenána informace o vzniklé chybě tak, aby rutina obsluhující INT 16 mohla blíže upřesnit příčinu přerušení.
  • Registry Xmm0 - Xmm7 se budeme zabývat později.

Než začněme

Než začněme s ukázkami programů, musíme si ujasnit několik podstatných věcí:

  • Win32 používá konvence STDCALL. To znamená, že všechny parametry, které jsou odesílány do rozhraní API, jsou PUSHed na zásobníku. Ve Win32 je ukazatel zásobníku (ESP) snížen o 4 bajty pro každou PUSH. Ve službě STDCALL je odpovědností API obnovit zásobník do rovnováhy.
  • Ve Win32 musí okenní programy a další procedury zpětného volání obnovit hodnoty v registrech EBP, EBX, EDI a ESI před návratem k volajícímu (pokud je změněna hodnota v těchto registrech).
  • "Volatilní (nestálé)" registry jsou ty, které mohou být změněny rozhraními API a které nemusíte ukládat a obnovovat ve svých okenních procedurách a dalších procedurách zpětného volání. Ve Win32 byly volatilní registry pro všeobecné účely jako EAX, ECX a EDX.
  • Do registrů EAX, EBX, ECX, EDX, ESI, EDI, EBP a ESP můžeme přistupovat pomocí existujících jmen AX, BX, CX, DX, SI, DI, BP a SP.
  • Do registrů EAX, EBX, ECX, EDX můžeme přistupovat pomocí existujících jmen Al, Bl, Cl, Dl taktéž platí přístup pomocí AH, BH, CH, DH.
  • Navrácená hodnota z funkce registr EAX nebo vrchol koprocesoru.

V dalším lekci, , si ukážeme převod datových typů API do assembleru a ukázky programů v knihovně dll.


 

 

Článek pro vás napsal zpavlu
Avatar
Jak se ti líbí článek?
4 hlasů
C# , C++ a assembler
Miniatura
Všechny články v sekci
Assembler
Aktivity (3)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!