Terminologie asembleru.doc

(251 KB) Pobierz
Terminologie

Terminologie

·         Bit - nejnižší jednotka nesoucí informaci, může nabývat hodnoty buď 1, nebo 0.

·         Slabika - byte, půlslovo, to je označení pro 8 bitů (bity číslujeme 7-0 popořadě), může nést hodnotu čísla se znaménkem (-128-127, shortint) nebo bez znaménka (0-255, byte); za počet slabik píšeme B (kB, MB).

·         Půlslabika - půlbyte, nibl, označení pro 4 bity.

·         Slovo - word, dvě slabiky, označení pro 16 bitů (bity číslujeme 15-0 (7-0, 7-0) popořadě), může nést hodnotu čísla se znaménkem (-32768-32767, integer) nebo bez znaménka (např. adresa, 0-65535, word).

·         Instrukce - pokyn mikroprocesoru k vykonání nějaké činnosti (přesuň, sečti).

·         Program - posloupnost instrukcí, které vedou k vykonání úlohy. Program je většinou uložen na disku ve formě souboru (typu EXE, COM). V něm je uložena řada čísel, které znamenají jednotlivé instrukce (strojový kód). Po spuštění je buď celý program, nebo jeho část, uložena do paměti počítače.

·         Překladač - program umožňující převést algoritmus zapsaný v textovém tvaru do strojového kódu mikroprocesoru. Ve strojovém kódu jsou jednotlivé instrukce zapsány s pomocí jedné, či více slabik, které jsou pro každou instrukci odlišné. Jestliže tedy necháme počítač, aby četl instrukce z části paměti, kde jsou data (ne operační kód instrukcí), dojde většinou k "zmrznutí" počítače, protože data mohou obsahovat kódy znamenající instrukce nesmyslného programu.

·         Mikroprocesor - v každém počítači nalezneme jeden, či více mikroprocesorů. Jedná se o část zajišťující přesuny dat v počítači a jejich zpracování. Uvnitř mikroprocesoru jsou vždy tyto části:

·        Aritmeticko-logická jednotka (ALU) - je to sčítačka doplněná o posuvné registry a logické obvody. Vykonává operace spojené se zpracováním dat: matematické, logické a posuvy (rotace). Počet bitů, se kterými je schopna ALU pracovat, udává, kolikabitový je celý mikroprocesor.

·        Registry - jsou rychlé paměti určené pro zaznamenávání dat a adres. Jednotlivé mikroprocesory se od sebe liší počtem registrů a jejich velikostí, která udává, jak velké číslo jsme schopni v něm uchovat. Jestliže registr slouží jako vstupní a výstupní pro hodnoty určené ALU, říkáme mu střadač.

·        Dekodér instrukcí - dekóduje číslo, které pro mikroprocesor znamená instrukci .

·        Obvody řízení - zajistí vykonání instrukce vytvořením posloupnosti impulsů, která ovlivní jednotlivé části procesoru tak, aby po ukončení této posloupnosti byla instrukce vykonána. Tato posloupnost je ovlivněna mikroprogramem popisujícím jednotlivé instrukce.

·         Paměť - je část počítače, kde je uložen program a data.

·         Zásobník - je část paměti sloužící k odkládání dat, případně k předávání hodnot mezi podprogramy.

·         Vstupní-výstupní porty - za ně považujeme obvody, které jsou určené k předání dat do, nebo z počítače.

·         Adresa - číslo označující místo slabiky v paměti, nebo vstupního/výstupního portu, se kterým chceme pracovat (tzn. kam chceme zapsat, odkud chceme číst). Maximální velikost adresy určuje velikost adresového prostoru, tedy počet slabik v paměti, nebo počet vstupně/výstupních portů.

·         Systémová sběrnice - je soustava vodičů určená k transportu dat, řídících signálů a adres mezi mikroprocesorem, pamětí a vstupně výstupními obvody. Má tyto části:

·        Datová sběrnice - určená k přesunům dat a kódů instrukcí.

·        Adresová sběrnice - určená k přesunům adres slabik v paměti a adres vstupně-výstupních portů.

·        Řídící sběrnice - určená k synchronizaci všech částí počítače.

Programátorský model mikroprocesoru 8086

Obvod 8086 je univerzální šestnáctibitový mikroprocesor. Má šestnáctibitovou ALU, to znamená, že je schopen provádět operace s šestnáctibitovými čísly. S okolím komunikuje po šestnáctibitové datové a dvacetibitové adresové sběrnici.

Segmentace paměti

Vzhledem k tomu, že obvod 8086 je schopen práce s pamětí o velikosti 1MB a obsahuje jen šestnáctibitové registry, je nutná tzv. segmentace paměti. Jedná se o logické dělení paměti do bloků po 64kB. Tomuto bloku říkáme segment a jeho počátek určuje programátor, případně je mu přidělen podle volného místa v paměti. Jediný požadavek na umístění počátku segmentu je, aby jeho adresa byla násobkem šestnácti. Umístění jednotlivých slabik v segmentu určuje offsetová část adresy (offset). Ta určuje, kolikátá je slabika od počátku segmentu. Adresa se skládá ze dvou částí: segment a offset. Obě tyto části jsou šestnáctibitové. Protože ale pro adresování paměti je nutné dvacet bitů, jsou za segmentovou adresu vyjádřenou binárně přidány čtyři bity s hodnotou nula (proto každý segment začíná na násobku šestnácti). K tomuto dvacetibitovému číslu je potom přičteno šestnáctibitové číslo určující offsetovou adresu. Takto vzniká dvacetibitové číslo znamenající skutečné umístění slabiky v paměti (fyzická adresa).

Výpočet skutečné adresy dvojkově:

segment:ssssssssssssssss0000
+offset:0000oooooooooooooooo
--------------------
adresa:aaaaaaaaaaaaaaaaaaaa

(segment jsou jednotlivé bity segmentové části adresy doplněné na konci o čtyři nuly, offset jsou jednotlivé bity offsetové části adresy doplněné na začátku o čtyři nuly, adresa je součet, tedy jednotlivé bity skutečné adresy)

Výpočet skutečné adresy hexadecimálně:

segment:ssss0
+offset:0oooo
-----
adresa:aaaaa

(segment jsou jednotlivé cifry segmentové části adresy doplněné na konci o jednu nulu, offset jsou jednotlivé cifry offsetové části adresy doplněné na začátku o jednu nulu, adresa je součet, tedy jednotlivé cifry skutečné adresy)

Například: Místo v paměti s adresou segmentu $AB1E a offsetu $1111 má skutečnou adresu:

segment:AB1E0
+offset:01111
-----
adresa:AC2F1

Tento způsob adresace umožňuje snadný přenos programu v paměti a jeho schopnost pracovat v každé její části. Program si pro svoji činnost vyčlení segment pro data, zásobník a strojový kód (instrukce). Na tyto bloky ukazují jednotlivé segmentové registry.

Důsledky segmentace:

·         přičteme-li k segmentové části adresy jedničku, zvýšíme skutečnou hodnotu adresy o šestnáct (což je to samé, jako bychom zvýšili offsetovou část adresy o šestnáct)

·         skutečnost, že se adresa tvoří součtem dvou čísel, vede k tomu, že stejné místo v paměti můžeme určit několika kombinacemi adres segmentu a offsetu dávajícími v součtu jeho fyzickou adresu

Pochopení segmentrace paměti je spíše ve znalosti dvojkové a šestnáctkové číselné soustavy.

POZOR!!! Neměli bychom zaměňovat pojmy segment a selektor. Segment určuje jen umístění bloku paměti. Selektor je použit u vyšších typů procesorů a jedná se vlastně o pořadové číslo v tabulce, která nese informace o vyčleněných místech paměti a jejich vlastnostech.

Z hlediska programátora jsou nejdůležitější registry. Ty se dělí na

·         registry pro všeobecné použití:

·        datové registry - šestnáctibitové (všechny vyhovují definici střadače), které je možné dělit na poloviny po osmi bitech, jejich použití bude probráno v dalších kapitolách:

·        AX (AH,AL) - střadač pro násobení a dělení, vstupně-výstuní operace

·        BX (BH,BL) - nepřímá adresace paměti (báze)

·        CX (CH,CL) - počitadlo při cyklech, posuvech a rotacích

·        DX (DH,DL) - nepřímá adresace vstupů/výstupů

·        ukazatele a indexregistry - pro umístění adresy (offsetu):

·        BP - bázový registr

·        SP - ukazatel zásobníku

·        DI - adresa cíle

·        SI - adresa zdroje

·        IP - ukazatel na aktuální místo programu

·         registr příznaků (F) - obsahuje šest bitů (indikátorů), které mikroprocesor nastavuje podle výsledku právě provedené operace, a umožňuje tak větvit program:

n       CF - Carry Flag, nastaví se do log. jedna, jestliže při právě provedené operaci došlo k přenosu z nejvyššího bitu osmibitového, nebo šestnáctibitového výsledku; tento indikátor je také využíván při posuvech a rotacích

n       PF - Parity Flag, se nastaví do log. jedna, pokud dolních osm bitů výsledku obsahuje sudý počet jedniček (a naopak)

n       AF - Auxiliary Carry Flag, nastaví se do log. jedna při přenosu 1 ze spodní poloviny nižší slabiky do vyšší; využívá se v BCD aritmetice (přenos do vyššího řádu)

n       ZF - Zero Flag, je v log. jedna při výsledku rovnému nule

n       SF - Sign Flag, je v log. jedna při záporném výsledku

n       OF - Overlow Flag, nastaví se do log. jedna, jestliže došlo k aritmetickému přetečení (výsledek se nevešel do cíle)

Tyto registry se nastavují automaticky, jestliže proběhla instrukce, která je nastavuje. Registr F je doplněn i třemi řídicími registry, které ovlivňují běh programu:

n       TF - Trap Flag, jestliže je nastavený v log. jedna, mikroprocesor je uveden do krokovacího režimu; je tak umožněno odladění programu

n       IF - Interrupt Enable Flag, při log. jedna umožňuje vykonání maskovatelného přerušení, tzn. programovou obsluhu událostí

n       DF - Direction Flag, je určen k řízení směru zpracování řetězcových operací; při log. jedna se data zpracovávají sestupně (a naopak)

Tyto tři registry může nastavit jen programátor vhodnými instrukcemi. Mikroprocesor je sám nenastavuje. Jestliže s registrem příznaků jako s celkem pracujeme, je šestnáctibitový a má tvar: X, X, X, X, OF, DF, IF, TF, SF, ZF, X, AF, X, PF, X, CF (bity X nejsou obsazeny)

·         segmentové registry - určené pro uložení druhé části adresy, segmentu:

n       DS - segment dat (proměnných)

n       ES - pomocný segment dat

n       SS - segment zásobníku

n       CS - segment programu

Mikroprocesor musí být schopen pracovat i se vstupy-výstupy. Umístění jednotlivých portů určuje šestnáctibitová adresa umístěná nejčastěji v registru DX. Pro programátora je důležitá i ta skutečnost, že si mikroprocesor vytváří tzv. frontu instrukcí. Jedná se o šest slabik znamenajících několik instrukcí, které budou následovat po právě prováděné instrukci. Tato fronta je průběžně doplňována při operacích nezatěžujících sběrnice z paměti. Protože se ale jedná o deset za sebou jdoucích slabik v paměti, je při instrukcích skoku v paměti vyprázdněna. Z tohoto důvodu je vhodné, aby program obsahoval co nejmenší počet skoků. Proto je v poslední době kladen důraz na programovací jazyky, které podporují tzv. strukturované programování bez nepodmíněných skoků. Mezi ně (částečně) patří Turbo Pascal a C. Je jasné, že programovací jazyk Basic se v tomto smyslu k mikroprocesoru nechová moc šetrně a zpomaluje tak běh programu. Mikroprocesor 80286 je strukturou i vlastnostmi podobný 8086. Je schopen pracovat ve dvou režimech. V základním reálném téměř přesně simuluje obvod 8086. Přesto v tomto režimu přináší některá rozšíření pro některé instrukce. Pokud v následujícím výkladu použiji rozšíření instrukcí pro 80286, uvedu to poznámkou [286]. Zdrojový text programu sestaveného i s pomocí instrukcí 80286 ve vkládaném assembleru stačí na prvním řádku (před uses) označit direktivou {$G+}.

Vkládaný assembler v jazyce Turbo Pascal

Vzhledem k jednoduchosti a názornosti se programovací jazyk Turbo Pascal vyučuje na školách. My se budeme zabývat tzv. vkládaným assemblerem. Jeho znalost umožní zrychlit námi psané programy, a přitom využívat výhod Pascalu ve snadném zápisu algoritmu. Vkládaný assembler je blok v programu psaném v jazyce Pascal. Tento blok začíná klíčovým slovem Asm a končí end. Řádky programu ve vkládaném assembleru se nečíslují a nemusí končit středníkem v případě, že na jednom řádku není více jak jedna instrukce (při více jak jedné instrukci musíme instrukce středníkem oddělit). Komentáře se píší do složených závorek, nesmějí však být uvnitř označení instrukce. Ve vloženém assembleru můžeme měnit obsahy registrů AX, BX, CX, DX, SI, DI, ES, F. Před návratem z bloku asm musíme obnovit hodnoty v registrech BP,SP, SS, DS.

Instrukce přesunů dat

Každý program musí být schopen přesunů dat a to mezi registry, registry a pamětí, registry a vstupy/výstupy. Při této operaci si musíme vždy uvědomit, kolikabitové číslo přesouváme. Počet bitů je většinou specifikován jménem použitého registru (osmibitové - AH, AL, BH, BL, . . ., šestnáctibitové - AX, BX, BP, DI, ES, DS . . .). V případě, že používáme jen paměť, specifikuje počet bitů pro operaci označení:

·         BYTE PTR označení pam. místa - specifikuje slabiku

·         WORD PTR označení pam. místa - specifikuje slovo

Přesuny registr - registr, registr - paměť

Všechny přesuny tohoto typu provedeme univerzální instrukcí:

·         MOV cíl, zdroj - do cíle přesuň ze zdroje (registr - registr, registr - paměť, registr - hodnota, paměť - hodnota, seg. registr - registr, seg.registr - paměť)

Použití této instrukce demonstruje příklad:

uses crt;
var slovo:word; {v paměti rezervuj 16 bitů a označ je slovo}
slabika:byte; {v paměti rezervuj 8 bitů a označ je slabika}
begin
asm
MOV AL,10 {do registru AL dosaď 8 bitů, hodnotu 10}
MOV slabika,AL {do paměti na místo ozn. slabika dosaď obsah AL}
MOV BX,10 {do registru BX (16 bitový) dosaď 10}
MOV slovo, BX {do paměti na místo ozn. slovo dosaď 16 bitů BX}
end;
writeln (slabika,' ',slovo);
readkey;
end.

Tento program má po překladu na místech proměnných v bloku asm označení paměťového místa, které pro ně bylo vyčleněno. Místo pro proměnné je vždy v segmentu globálních proměnných. Segmentová adresa tohoto bloku je vždy umístěna v registru DS. To, že DS ukazuje na segment dat programu, může vést k chybě, která spočívá v jeho změně a následném čtení z globálních proměnných. Takže pozor! Po změně registru DS je práce s globálními proměnnými nemožná, protože jsme si k nim uřízli cestu. Do segmentových registrů nejde dosadit hodnota přímo. Tu nejrychleji dosadíme tak, že ji vložíme do některého univerzáního registru a z něj teprve do segmentového registru (například MOV AX,adresa; MOV ES,AX).

Metody adresace

Místo (offset) v paměti označuje vždy určitá hodnota zapsaná v hranatých závorkách. Instrukce MOV BYTE PTR ES:[$100F], 10 znamená: na adresu slabiky offset 100F ($ označuje použití hexadecimální soustavy) v segmentu určeném adresou v ES, dosaď hodnotu 10. Jestliže segment nespecifikujeme označením a dvojtečkou, vztahuje se adresa k segmentu v DS. V praxi by tato metoda omezovala programátora v rozletu. Proto ASM86 umožňuje i další metody adresace. Ale popořadě . . .

·         Přímá adresa
MOV AH, ES:[$1A40] - do registru AH předej 8 bitů z adresy určené ES a číslem
Tuto metodu použijeme, jestliže předem víme adresu hledaného místa v paměti. Na pomoc v Turbo Pascalu jsou operátory:

·        OFFSET proměnná - vrací offsetovou adresu proměnné

·        SEG proměnná - vrací segmentovou adresu proměnné (pro globální proměnné vrací vždy obsah DS)

Jejich použití umožní zjistit adresu proměnných deklarovaných v části var (const . . .).

Příklad:

var promenna: byte;
begin
asm
MOV BYTE PTR [offset promenna], 10 {na adresu slabiky proměnné dosaď 10}
end;
end.

Segmentová adresa se v tomto příkladu nemusí určit. Je v DS, a ten se nemusí uvádět. Překladač Pascalu tuto metodu používá i pro naše globální proměnné. Při překladu je totiž každé proměnné přiděleno místo v paměti s pevnou offsetovou adresou (takže zápis OFFSET proměnná nese právě tuto adresu). Specifikace, jestli se jedná o slabiku, nebo slovo, je nutná, protože jinak by procesor nevěděl, jestli má číslem obsadit jednu, nebo dvě slabiky.

·         Nepřímá adresa
MOV AH, ES:[BX] - do registru AH předej obsah pam. místa specifikovaného adresou v BX
Pozor! Do registru AH je uložen obsah v paměti na adrese v BX, ne obsah registru BX. Offsetová část adresy je uložena v některém z adresových registrů BX, BP, SP, SI, DI. Vzhledem k tomu, že obsah těchto registrů můžeme měnit, použijeme tuto metodu v případě pohybu po paměti.
Příklad:
var promenna: byte;
begin
asm
MOV BX, offset promenna {do BX dosaď adresu proměnné}
MOV BYTE PTR [BX], 10 {na její adresu dosaď hodnotu 10}
end;
end.

·         Bázová adresa
MOV AH, [BX + adresa] - k registru BX přičti konstantu adresa, výsledná hodnota je adresou odkud se má načíst do registru AH
Bázová adresa se tvoří s pomocí obsahu jednoho z bázových registrů BP, BX. Výraz v závorce se vyhodnotí, přitom označení registrů zastupuje jejich obsahy. Tento druh adresy používáme při zjišťování hodnot parametrů určených pro podprogramy (případně k přístupu k lokálním proměnným).

·         Indexovaná adresa
MOV AH, ES:[adresa + SI] <=> (je shodné) MOV AH, adresa[SI] - registr SI sečti s konstantou adresa, výsledek je hodnota adresy offsetu do paměti
Tento způsob adresace je obdobou předchozí tvorby adresy. Používá se však při práci s bloky v paměti. Zde jsou k dispozici indexové registry SI, DI.
Příklad:
var pole: array [0..9] of byte;
begin
asm
MOV SI, 0 {nuluj registr SI}
MOV BYTE PTR offset pole[SI], 10{adr. pole sečti s SI a dosaď 10}
end;
end.

Program dosadí na první místo pole hodnotu. Protože registr SI můžeme zvyšovat, budeme tímto způsobem realizovat pohyb v poli.

·         Kombinovaná adresa báze + index
MOV AH, [BX + SI] <=> MOV AH, [BX][SI] - obsahy registrů BX a SI sečti, výsledek je hodnota offsetu odkud se má číst
Kombinovaná adresa umožňuje pracovat s adresou, která se skládá ze součtu dvou registrů (jednoho bázového BX, BP a jednoho indexového SI, DI).
Příklad:
var pole: array [0..9] of byte;
begin
asm
MOV BX, offset pole {do registru BX dosaď adresu pole}
MOV...

Zgłoś jeśli naruszono regulamin