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ň