Programátorský model mikroprocesora 8086 |
||
| <= | => | |
Obvod 8086 je univerzálny šestnásťbitový mikroprocesor. Má šestnásťbitovú ALU, to znamená, že je schopný prevádzať operácie so šestnásťbitovými číslami. S okolím komunikuje po šestnásťbitovej dátovej a dvadsaťbitovej adresovej zbernici.
Vzhľadom k tomu, že obvod 8086 je schopný práce s pamäťou veľkosti 1MB a obsahuje len šestnásťbitové registre, je nutná tzv. segmentácia pamäte. Jedná sa o logické delenie pamäte do blokov po 64kB. Tomuto bloku hovoríme segment a jeho začiatok určuje programátor, prípadne je mu pridelený podľa voľného miesta v pamäti. Jediná požiadavka na umiestnenie počiatku segmentu je, aby jeho adresa bola násobkom šestnástich. Umiestnenie jednotlivých slabík v segmentu určuje ofsetová časť adresy (offset). Tá určuje, koľká je slabika od počiatku segmentu. Adresa sa skladá z dvoch častí: segment a offset. Obe tieto časti sú šestnásťbitové. Pretože ale pre adresovanie pamäte je nutných dvadsať bitov, sú za segmentovou adresu vyjadrenou binárne pridané štyri bity s hodnotou nula (preto každý segment začína na násobku šestnástich). K tomuto dvadsaťbitovému číslu je potom pričítané šestnásťbitové číslo určujúce ofsetovú adresu. Takto vzniká dvadsaťbitové číslo znamenajúce skutočné umiestnenie slabiky v pamäti (fyzická adresa).
Výpočet skutočnej adresy binárne:
segment:ssssssssssssssss0000
+offset:0000oooooooooooooooo
--------------------
adresa: aaaaaaaaaaaaaaaaaaaa
(segment sú jednotlivé bity segmentovej časti adresy doplnené na konci o štyri nuly, offset sú jednotlivé bity ofsetovej časti adresy doplnené na začiatku o štyri nuly, adresa je súčet, teda jednotlivé bity skutočnej adresy)
Výpočet skutočnej adresy hexadicky:
segment:ssss0
+offset:0oooo
-----
adresa: aaaaa
(segment sú jednotlivé cifry segmentovej časti adresy doplnené na konci o jednu nulu, offset sú jednotlivé cifry ofsetovej časti adresy doplnené na začiatku o jednu nulu, adresa je súčet, teda jednotlivé cifry skutočnej adresy)
Napríklad: Miesto v pamäti s adresou segmentu 0xAB1E a offsetu 0x1111 má skutočnú adresu:
segment:AB1E0
+offset:01111
-----
adresa: AC2F1
Tento spôsob adresovania umožňuje jednoduchý prenos programu v pamäti a jeho schopnosť pracovať v každej jej časti. Program si pre svoju činnosť vyčlení segment pre dáta, zásobník a strojový kód (inštrukcie). Na tieto bloky ukazujú jednotlivé segmentové registre.
POZOR!!! Nemali by sme zamieňať pojmy segment a selektor. Segment určuje len umiestnenie bloku pamäte. Selektor je použitý u vyšších typov procesorov a jedná sa vlastne o poradové číslo v tabuľke, ktorá nesie informácie o vyčlenených miestach pamäte a ich vlastnostiach.
Z hľadiska programátora sú najdôležitejšie registre. Tie sa delia na
Mikroprocesor musí byť schopný pracovať i so vstupmi - výstupmi. Umiestnenie jednotlivých portov určuje šestnásťbitová adresa umiestnená najčastejšie v registri DX. Pre programátora je dôležitá i tá skutočnosť, že si mikroprocesor vytvára tzv. frontu inštrukcií. Jedná sa o šesť slabík znamenajúcich niekoľko inštrukcií, ktoré budú nasledovať po práve prevádzanej inštrukcii. Táto fronta je priebežne doplňovaná pri operáciách nezaťažujúcich zbernice z pamäte. Pretože sa ale jedná o desať za sebou idúcích slabík v pamäti, je pri inštrukciách skoku v pamäti vyprázdnená. Z tohoto dôvodu je vhodné, aby program obsahoval čo najmenší počet skokov. Preto sa v poslednej dobe kladie dôraz na programovacie jazyky, ktoré podporujú tzv. štruktúrované programovanie bez nepodmienených skokov. Medzi ne (čiastočne) patrí Turbo Pascal a C. Je jasné, že programovací jazyk Basic sa v tomto zmysle k mikroprocesoru nechová moc šetrne a spomaľuje tak beh programu. Mikroprocesor 80286 je štruktúrou i vlastnosťami podobný 8086. Je schopný pracovať v dvoch režimoch. V základnom reálnom takmer presne simuluje obvod 8086. Napriek tomu v tomto režime prináša niektoré rozšírenia pre niektoré inštrukcie. Pokiaľ v nasledujúcom výklade použijem rozšírenie inštrukcií pre 80286, uvediem to poznámkou [286].
| <= | => |