Učebnice Assembleru 86

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:

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

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+}.

Směr