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ň