Mikroprocesor 8086
str.: - 1 –
MIKROPROCESOR 8086 Obecný popis Mikroprocesor je „mozkem“ počítače, zpracovává instrukce od programů, kterými je řízen a tak vlastně plní zadané úkoly. Některé instrukce zpracovává sám, při provádění jiných spolupracuje s ostatními částmi počítače (oper. paměť, disky, sběrnice, monitor, tiskárna atd.). Jeho kvalita podstatně (ale nikoli výlučně) ovlivňuje rychlost a výkonnost počítače. Výraz „mikroprocesor“ je složen ze dvou částí - mikro - součástka je miniaturizovaná do jediného pouzdra - procesor - schopnost pracovat podle připraveného programu Základní vlastností mikroprocesoru je tedy programovatelnost a integrace všech základních obvodů do jediného pouzdra. Jádrem každého mikroprocesoru je logický obvod, který dokáže zpracovat sadu jednoduchých mikroinstrukcí. Mikroinstrukce jsou elementární příkazy. Napsat aplikační program přímo z mikroinstrukcí by bylo nesmírně složité. Proto každý mikroprocesor je vybaven pro praktické programování „přívětivější“ sadou instrukcí. Převod těchto instrukcí (používá programátor) na mikroinstrukce (těm rozumí mikroprocesor) obstarává program napsaný v mikroinstrukcích - je další podstatnou částí mikroprocesoru (jeho řadiče). Z tohoto pohledu dnes existují dvě koncepce mikroprocesorů: CISC a RISC. CISC - Complete Instruction Set Computer - mikroprocesor má co nejúplnější instrukční sadu RISC - Reduced Instruction Set Computer - redukovaná instrukční sada. Mikroprocesor RISC je vybaven jen základními mikroinstrukcemi, které jsou snadněji a rychleji proveditelné. Lze říci, že mikroprocesor typu RISC vykoná určitou instrukci daleko rychleji, než CISC . Zbytek instrukcí, které nejsou obsaženy v základní sadě RISC, je možno vykonat kombinací instrukcí existujících.To je sice složité a časově náročné, jelikož jsou však potřebné jen občas, pak čas ušetřený používáním základních instrukcí daleko převyšuje. Vlastní mikroprocesor RISC je sice jednodušší a levnější, avšak má-li se využít jejich rychlosti, musí se počítač vybavit rychlými obvody, čímž se řešení může prodražit. U osobních počítačů s mikroprocesory řady Intel 80x86 převládají mikroprocesory CISC, totéž platí i pro klony od firem AMD, Cyrix a pod. I procesory Pentia jsou typu CISC, avšak u nich se začínají stále více uplatňovat prvky RISC. Představitelem technologie RISC ve světě PC je např. mikroprocesor PowerPC (Motorola, IBM, Apple). Procesory RISC se však uplatnily u „velkých“ počítačů, nebo jako jednoúčelové (ovládání laserových tiskáren).
Mikroprocesor 8086 První 16bitový mikroprocesor Intelu. Navazuje na 8bitové mikroprocesory 8080. Typické vlastnosti 8086: - možnost komunikovat po 16bitové i 8bitové datové sběrnici - značné rozšíření instrukčn. souboru o operace s 8 i 16bitovými operandy, včetně násobení a dělení a operace s řetězci. - orientací na bázové registry lze organizovat paměť do určit. segmentů - snadná implementace dynamicky přemistitelných programů a to i po přeložení do strojového jazyka. Lze adresovat paměť do rozsahu přes 1MB. Základ vnitřního uspořádání tvoří dvě procesní jednotky: a) EU - Execution Unit - vykonává operace předepsané instrukcemi b) BIU - Bus Interface Unit - zprostředkovává komunikaci mezi vstupy a výstupy a jednotkou EU. Také provádí správu paměti (za pomoci tzv. segmentování). Jednotky EU a BIU pracují relativně nezávisle. To dovoluje překrytí fáze čtení a výběru instrukce s fází vykonání předchozí instrukce - tím celkové zrychlení činnosti (zdánlivě mizí fáze výběru). EU je u procesorů 8086 a 8088 stejná .Obsahuje ALU, která zpracovává operandy, nastavuje příznaky a ovládá registry. Registry i všechny přenosy dat jsou v EU 16bitové. EU nemá přímý přístup k systémové sběrnici. Data i instrukce dostává z BIU (žádá BIU o čtení nebo zápis dat). adresy v EU jsou 16bitové a BIU je upravuje pro styk s pamětí na 20bitové.Tím je umožněn přístup k úplné paměti 1MB.
Mikroprocesor 8086
str.: - 2 –
V době kdy EU vykonává instrukci, předvídá BIU chod programu a vybírá následující instrukce, které ukládá do registru instrukcí v BIU. Tyto registry jsou organizovány jako paměť FIFO - tzv. fronta instrukcí. Fronta značně zrychluje rychlost práce mikroprocesoru, EU nemusí čekat na výběr příští instrukce Výjimkou je případ, kdy se provádí instrukce skoku.Tím se běžné pořadí instrukcí poruší, obsah fronty je ovšem zbytečný a fronta se vynuluje
Sběrnice 8086 • datová - 16bitová (u 8088 jen 8bitová), obousměrná, multiplexovaná s částí adresní sběrnice • adresová - 20bitová, jen výstupní , částečně multiplexovaná s datovou sběrnicí • stavová informace (informace pro součinnost s ostatními obvody) - vývody S0 až S7 - rovněž částečně multiplexovaná s adresní sběrnicí. Ve vnitřní struktuře je celkem 14 šestnáctibitových registrů, z nichž jeden lze adresovat bitově (registr F) a čtyři lze rozdělit (každý z nich na 2 osmibitové). Registry jsou seřazeny do 4 skupin: 1) datové registry AX až DX - standardně využívané takto: AX - střadač, BX - pomocný bázový registr CX - čítač cyklu, DX - registr dat 2) registry adresační, indexové a ukazovátkové - SP (stack pointer) - pro adresaci zásobníku - BP (base pointer) - pro adresaci báze polí - SI, DI - indexové registry ( ve vybraném poli dat) 3) registry segmentů operační paměti : CS - pro segment programu DS - pro segment dat SS - pro segment zásobníku ES - pro pomocný segment 4) registr čítače instrukcí IP, (případně registr příznaků F) Uložení dat Paměti používané mikroprocesory jsou rozčleněny po bytech.Každý byte obsahuje 8 bitů, číslovaných zprava 0 až 7, nejnižší řád má bit 0. 16bitová slova (2 byty) se do paměti ukládají tak, že na nižší adrese je dolní byte a na vyšší adrese je horní byte. Adresou celého slova je pak adresa dolního bytu. Např. číslo 3456H je v paměti na adrese: n uloženo takto: 5 6 3 4 01010110 00110100 adresa: n adresa: n+1 Osmibitová nebo šestnáctibitová slova dat nebo instrukcí lze ukládat na libovolné adresy a to tak, že se slovo o dvou bytech ukládá do dvou sousedních adres. Dolní byte na specifikovanou adresu, horní byte na následující adresu. Organizace paměti Paměť připojená na sběrnici procesoru se nazývá fyzická paměť. Je organizována jako posloupnost slabik. Každé slabice je přiřazena fyzická adresa, která je u 8086 v intervalu 0 až 220 , t.j. 1MB. Technické prostředky
Mikroprocesor 8086
str.: - 3 –
„odstiňují “ programátora od fyzických adres a poskytují mu tzv.virtuální paměť . Odkazuje-li se program na paměť, použije tzv. logickou adresu. Tato se segmentováním překládá na adresu fyzickou. Rozsáhlejší programy se nevytvářejí jako jeden velký celek, ale jsou složeny z většího počtu programových modulů. Ty se zcela samostatně překládají a odlaďují. Značně rozsáhlé programy se dokonce skládají z více procesů a každý proces z více modulů. Také se při programování hojně používá knihovních programů. Z těchto všech částí se pak provádí jejich spojování - linkování. Tomu je procesor 8086 přizpůsoben tím, že má možnost rozdělit hlavní paměť na 4 segmenty - t.j. vzájemně nezávislé prostory . Různé segmenty se používají pro uložení instrukcí prováděného programu, pro jejich data nebo pro zásobník. Pro jejich ovládání je 8086 vybaven segmentovými registry : • CS - segmentový registr programu (Code Segment) – je nejdůležitější, jelikož obsahuje segmentovou část adresy právě běžícího programu • DS - segmentový registr dat (Data Segment) - je určen k adresování dat v hlavní paměti • SS - segmentový registr zásobníku (Stack Segment) - ukazuje na segment strojového zásobníku • ES - zvláštní segmentový registr (Extra Segment) je využíván při přesunech dat, jinak je volně k
dispozici. V každém z těchto registrů může být uložena počáteční adresa segmentu. Adresy operační paměti (může jít o instrukce, data nebo paměť. buňky zásobníku) jsou pak relativní k těmto počátečním adresám v těchto registrech. • IP - tento registr obsahuje offsetovou část adresy právě zpracovávané instrukce. Takováto segmentace paměti přináší několik výhod: (a) je oddělena počáteční adresa segmentu (zkráceně segment) od tzv. offsetu (česky adresové posunutí ). (b) uvnitř modulu lze považovat bázi za nulovou adresu a od ní offset počítá adresy - posouvá se až ke specifikované adrese. (c) v segmentu se adresuje jen 16bitovým offsetem, takže segment je nezávislý na svém umístění v paměti a lze ho přemisťovat pouhou změnou obsahu segment. registru. (d) segmentace lze využít k vytvoření virtuální paměti a k víceúrovňové ochraně paměti. Architektura 8086 tedy předpokládá paměť rozdělenou na segmenty - 16bitové adresy v EU a 20bitové vnější adresy . Pro adresování 1 MB paměti pak stačí pracovat s 16bitovými adresami v EU. Segment má vždy délku 64 KB a jeho počáteční adresa musí být násobkem 16, aby bylo možné používat 16bitových segmentových registrů. Jiná omezení nejsou. Segmenty spolu mohou sousedit nebo se mohou částečně nebo úplně překrývat. Teoreticky jich může být neomezené množství. Segmentace je tedy pouze logické rozdělení paměti a jeho strukturu určuje programátor. Ty segmenty, jejichž bázové adresy jsou právě v segmentových registrech nazýváme aktuální segmenty. Logická adresa určitého místa v paměti je tedy tvořena bázovou adresou segmentu a offsetem - obojí jsou 16bitové adresy bez znaménka. Konkrétně bázová adresa je v segment registrech CS, DS, SS, ES a offset může být zadán v instrukci, v BIU program. ukazatelem IP nebo v registrech EU. Logickou adresu zapisujeme ve tvaru segment : offset . Segment obsahuje adresu začátku segmentu, offset je pak relativní adresa uvnitř segmentu. Skutečná fyzická adresa se v BIU vytvoří takto: ° do 20bitové sčítačky se přivede příslušná bázová adresa segmentu a posune se o 4 bity doleva. Tím vznikne fyzická adresa počátku segmentu, která má vždy 4 nejnižší bity nulové. ° potom se přičte posunutí (offset), dodané buď z IP nebo z EU. Tím vznikne skutečná fyzická 20bitová adresa. Celý průběh bychom mohli popsat rovnicí : fyzická adresa = bázová adresa ∗ 24 + offset
Schéma adresace procesoru 8086
Mikroprocesor 8086
str.: - 4 –
Důsledkem adresování je paměť rozdělena na jednotlivé bloky o velikosti 64 kB (segmenty). Segmentová část adresy po vynásobení šestnácti (připsání čtyř nul na nejnižší bity) ukazuje na začátek segmentu a offset je pozice v segmentu vzhledem k jeho začátku. Segmentové registry udávají segmentovou část adresy. Velikost jednoho segmentu, v jehož rámci je možné se pohybovat pouze pomocí změny hodnoty offsetu, je 64 kB. Adresa se zapisuje ve tvaru segment:offset. Např. 4000:B000 značí adresu 4B000 (hexadecimálně), tj. 307200 (dekadicky).
Přerušení Přerušení v procesoru 8086 využívají jak vnější zařízení (pro obsluhu), tak i procesor pro signalizaci vyjimečných událostí (dělení nulou apod.) Mimo to ho využívá operační systém a programy v pamětech ROM pro zpřístupnění vlastních služeb programátorovi. Přerušení členíme do několika skupin:
•
Vnější
•
Vnitřní
- nemaskovaná - maskovaná - instrukcí INTn - chybou při běhu programu
Přerušení INTR Vstup INTR je úrovňový a spolupracuje s obvodem 8259A. Po aktivaci tohoto vstupu se vždy nejprve dokončí instrukce a poté se postupuje podle stavu indikátoru povolení přerušení IF. Je-li přerušení zakázáno (IF = 0), žádný požadavek není akceptován. Je-li přerušení povoleno (IF = 1), potvrzuje procesor přerušení signálem INTA. Při prvním signálu INTA obvod 8259A upravuje své vnitřní stavy. Při druhém signálu INTA pak vyšle na datovou sběrnici 8bitový kód - typ přerušení (který se nazývá vektor přerušení). Podle typu přerušení procesor volá odpovídající obslužný program žádajícího zařízení. V případě více žádostí o přerušení ve stejném okamžiku je proveden výběr podle priorit. Pro přerušení INTR jsou uživatelská přerušení od INT 5 do INT 255 (viz tab.). Povolit přerušení INTR lze instrukcí STI (Set Interrupt-enable Flag) a zakázat instrukcí CLI (Clear Interrupt-enable Flag). Navíc lze pomocí obvodu 8259A maskovat přerušení.
Přerušení NMI Vstup NMI (Non-maskable Interrupt) reaguje na hranu signálu a používá se pro identifikaci událostí ohrožujících počítač jako je výpadek napájení, chyba parity na sběrnici apod. Přerušení NMI má vyšší prioritu než INTR a nemůže být zakázáno! Procesor je schopen rozlišit 256 různých přerušení a pro každé přerušení je uloženo 32 bitů adresy pro počátek obslužného programu. Adresy jsou uloženy v paměti v tabulce vektorů přerušení, která má počáteční adresu 0000 0000 H a délku 1 KB. Při přerušení instrukcí INTn (vyhrazeno 5 přerušení) se po vykonání instrukce s adresou A provede následující posloupnost činností:
− − − − −
do zásobníku se uloží obsah registru příznaků, v registru příznaků se vynulují příznaky IF a TF, do registru CS se přepíše l6bitová adresa vektoru přerušení, do zásobníku se uloží obsah registru EP ukazující na adresu A+l, registr IP se přepíše l6bitovou adresou.
Pro následující činnost je obdobně jako u procesoru 8080 třeba uschovat do zásobníku nejdůležitější registry pro obnovu činnosti přerušeného programu. Navíc se vynulováním IF zajistí nerušený průběh obsluhy přerušení. Pokud je to nezbytné, může programátor povolit přerušení v průběhu obsluhy přerušení. Návrat do přerušeného programu zajistí instrukce IRET následující posloupností činností a to tak, že ze zásobníku:
• obnoví obsah registru IP, • obnoví obsah registru CS, • obnoví obsah registru příznaků. Pro některé vektory přerušení generované procesorem 8086 jsou v tabulce vektorů přerušení rezervována místa. Jedná se o následující přerušení:
− INT 0 - celočíselné dělení 0 (Divide by Zero), − INT 1 - krokovací režim (Single-step), − INT 2 - nemaskovatelná přerušení (NMI), − INT 3 - ladicí bod (Breakpoint Trap), − INT 4 - přeplnění (Overflow Trap).
Mikroprocesor 8086
str.: - 5 –
Způsoby adresace Existuje 6 způsobů adresování týkající se výpočtu posunutí adresy, které dále probereme. Posunutí se získá z následujících částí: • přímé adresy uložené v instrukci (Displacement), • báze (obsah registru BP nebo BX), • indexu (obsah registru SI nebo DI). Všechny dále uvedené způsoby vycházejí z jediného základního způsobu, který lze popsat následovně: vypočtená adresa = přímá adresa + báze + index Přímá adresa. K posunutí adresy operandu z fyzické paměti je přiřazena 16bitová přímá adresa uložená v instrukci. Příkladně přímá adresa v instrukci MOV je segmentována přes registr DS, v jiných instrukcích, jako JMP, je segmentována přes registr CS. Nepřímá adresa. Posunutí adresy se přiřadí obsah některého z registrů SP, BP, BX, DI, SI. V těchto registrech je uložena jen adresa, jejíž obsah nám teprve poskytne žádanou adresu. Bázová adresa. Posunutí adresy vznikne sečtením přímé adresy z instrukce s některým z bázových registrů (BP, BX). Adresy v těchto registrech určují počátky záznamu a přímá adresa pak obsahuje vzdálenost od počátku záznamu. Indexovaná adresa. Posunutí adresy vznikne sečtením přímé adresy z instrukce s některým z indexových registrů (SI, DI). Tento způsob adresace se používá pro přístup ke strukturám s pevnou počáteční adresou jako jsou pole, kde přímá adresa určuje počátek pole a SI (DI) je indexem vybírajícím daný byte pole. Bázové i indexové způsoby adresace jsou vlastně shodné, rozdíl je jen v použití toho kterého registru. Kombinovaná adresa báze + index. Je to kombinace bázové a indexové adresy. Posunutí vznikne součtem hodnot uložených v bázovém registru (BP.BX) a indexovém registru (DI,SI). Tohoto způsobu se využívá v případech, kdy se např. mění počáteční adresa pole. Pak bázový registr určuje počáteční adresu pole a indexový registr jednotlivé prvky pole. Kombinovaná adresa přímá + báze+ index. Posunutí vzniká jako součet obsahu bázového registru (BP,BX), indexového registru (DI,SI) a přímé adresy z instrukce. Používá se pro přístup k vehni složitým strukturám. Bázový registr určuje počátek záznamu, přímá adresa určuje vzdálenost počátku uvnitř záznamu a obsah indexového registru vybírá jednotlivé prvky pole.