P R O C E S O R 8086 V sekci o tvorbě softwaru vás zasypávájí různými učebnicemi assembleru, ale neuvědomují si, že k zvládnutí assembleru je velmi důležité znát procesor. Tento nedostatek bych chtěl v následujících řádcích odstranit. Architekturu budu vysvětlovat na procesoru 8086 a možná někdy příště napíšu inovace. Procesor 8086 byl revoluční. Obsahoval 29 000 transistorů, což byla na tehdejší dobu obrovská integrace. Procesor je taktován od 5 do 16 Mhz. Paměť je adresovatelná do 1 MB segmentovaně a do 64 kB v rámci jednoho segmentu. Procesor je navržen už pro multiprocesorové počítače. Z toho vyplývají různé instrukce pro řízení sběrnice a nadřazenosti jednotlivých procesorů. K urychlení matematických operací je možno připojit matematický koprocesor 8087. Činnost procesoru spočívá v následujících krocích: - výběr instrukce z paměti - čtení operandů, pokuď je instrukce vyžaduje - provedení instrukce - odeslání výsledku instrukce Předchozí procesory vykonávaly tyto kroky postupně. Snaha byla tedy alespoň o částečné překrytí některých kroků. K tomu je ovšem nutná velká integrace, která byla už v roce 1974 k dispozici. Instrukce se tedy načítají do zásoby (fronty) a styk s pamětí je oddělen od ALU (Aritmeticko - logická jednotka). Procesor 8086 je tedy složen ze dvou subprocesorů. Operační subprocesor EU (Eecution unit) vykonává instrukce a subprocesor styku se sběrnicí BIU (Bus interface unit) vybírá instrukce z paměti, čte operandy a ukládá výsledky. Tyto dva subprocesory pracují na sobě nezávisle, čímž dochází k překrytí dvou úkonů. EU je šestnáctibitová aritmeticko-logická jednotka. Nemá žádný styk s vnější sběrnicí. Všechna data dostává od stykové jednotky BIU. Obě jednotky jsou propojeny dvěma drahami. Šestnáctibitovou obousměrnou proudí operandy a výsledky instrukce, osmibitovou jednosměrnou proudí instrukce z fronty instrukcí. Manipulace s adresami v EU jsou samozřejmě šestnáctibitové. Podle instrukce poskytuje EU BIU buď jen offsetovou adresu, nebo segmentovou i offsetovou. Stykový Subprocesor BIU zajišťuje veškerý styk s pamětí. V době, kdy EU vykonává instrukci, vybírá BIU instrukce z paměti do zásobníku. Zásobník je malá paměť o obsahu 6 bytů (u 8086) typu FIFO (First in - First out). Zásobník se doplňuje nejdříve po uvolnění 2 bytů. To je dáno strukturou procesoru, který se snaží číst z paměti po slovech. Instrukce jsou v zásobníku uspořádány stejně jako v paměti. Jestliže dojde ke skoku, zásobník se vyprázdní a EU čeká na jeho naplnění. Dále obsahuje BIU sčítačku, která tvoří ze segmentové a offsetové části adresy adresu fyzickou (0-FFFFFFh). Některé registry jsou v EU a některé v BIU. Toto rozdělení je dáno jejich použitím. Nejdříve si popíšeme registry v EU. Registry v EU se dělí do tří částí. Skupina HL obsahuje 4 šestnáctibitové registry: AX.....Násobení-dělení slov, konverze,I/O instrukce BX.....Převody kódů, lze použít jako pointer register CX.....Čítač cyklů, posunů a rotací DX.....podobně jako AX, nepřímé I/O adresy (všechny registry jdou použít jako dělené AX=AHAL) Skupina PI obsahuje rovněž čtyři šestnáctibitové nedělené registry. Jejich využití je při relativním adresování, ale v některých případech jdou použít jako registry skupiny HL. SP.....ukazatel zásobníku BP.....ukazatel báze ukazující do zásobníkového segmentu SI.....index ukazující na zdrojový řetězec DI.....index ukazující na cílový řetězec Skupina indikátorů FL je tvořena jedním šestnáctibitovým registrem. Využito je pouze 9 stavových bitů. Registr FL vypadá následovně: XX XX XX XX OF DF IF TF SF ZF XX AF XX PF XX CF OF.....Přetečení DF.....Směr čtení a ukládání řetězců IF.....Povolení přerušení TF.....Krokování SF.....Znaménko ZF.....Nula AF.....Přenos PF.....Parita CF.....Přenos, přetečení V BIU je logika pro styk se sběrnicí a 20bitová sčítačka pro tvorbu fyzické adresy. Proto je v BIU umístěna skupina šestnáctibitových registrů, které jdou používat jen omezeně. CS.....Code segment - segmentová část adresy programu DS.....Data segment - segmentová část adresy dat SS.....Stack segment - segmentová část adresy zásobníku ES.....Extra segment - propoužití stringových operací IP.....Instruction pointer - ukazatel instrukce v CS Data jsou v paměti ukládána po bytech. Slova mohou být uložena od liché nebo sudé adresy. Výhodnější je uložení na sudé adrese, protože se slovo načte najednou. Pokuď je slovo uloženo na liché adrese, bude načítáno nadvakrát. Méně významný byte je na udané adrese, výnamnější na adrese o 1 vyšší. Pointery jsou uloženy jako dvě slova. Offset je na udané adrese, segment na adrese o 2 vyšší. Maximální paměť procesoru 8086 je 1 MB. Paměť je logicky rozdělena do segmentů o velikosti 64 kB. Segmenty si lze představit jako množinu adres, která má programem přidělenou počáteční adresu, která je násobkem šestnácti. Fyzická dvacetibitová adresa lze spočítat jednoduchým vztahem: segment*16+offset. Segmenty na sebe mohou navazovat, nebo se překrývat. Jedno fyzické místo v paměti může patřit najednou i několika segmentům. Mnoho lidí se diví, proč je adresování pomocí segmetů a offsetů. Je to kvůli zjednodušení instrukční sady a pro zrychlení. Rozděluje se proto nekolik typů skoků např. na absolutní a relativní. Rozdíl je krásně vidět na skoku JMP. Při blízkém návěští má délku 2 byty, adresace je -127 +128, při absolutním skoku má délku 5 bytů. Zápis vypadá následovně: FF + segment(2 byty) + offset(2 byty). Instrukční sada podporuje aritmetiku v těsném i volném BCD kódu, ale tuto vlastnost jsem v životě nepoužil. K dispozici je 134 instrukcí. Jako samotná instrukce se počítají různé varianty, např. instrukce mov d,s má 11 variant. Jako programátoři to samozřejmě nevnímáte. Instrukce mohou být 1,2,3,4 a šestibytové. Na závěr bych se rád zmínil o přerušovacím systému. mikroprocesor 8086 zvládá 256 typů přerušení, která se dělí na vnitřní a vnější. Vnější přerušení jsou INTR maskovatelná, která jdou zakázat stavovým bitem IF. NMI nemaskovatelná nejdou zakázat a mají vyšší prioritu. Vnitřní přerušení se dají volat pomocí instrukce INTn. Tato instrukce si najde v tabulce vektorů přerušení (80-3FFh) adresu paměti, kam má skočit. Všechna vnitřní přerušení jsou maskovatelná. To je asi vše, co jsem vám chtěl sdělit, a doufám, že jste aspoň něco pochopili. Možná vám to někdy pomůže při programování v assembleru. DUMMY výheň