Od tejto lekcie si postupne v niekolkych dalsich lekciach priblizime instrukcny subor procesora 86. Instrukcny subor je mnozina vsetkych instrukcii ktore vie procesor vykonavat a ktore moze programator pouzivat pri programovani svojich programov. V minulych lekciach sme si ako ukazkove priklady uz spominali niektore instrukcie, teraz sa vsak systematicky pozrieme na cely instrukcny subor.

   Vsetky instrukcie procesora 86 mozno rozdelit do niekolkych hlavych skupin (tiez nazyvanych "funkcne" skupiny):

   Ked sa lepsie zamyslime nad nazvom poslednej funkcnej skupiny, prideme na to ze by sa tam vlastne dali zahrnut aj vsetky ostatne skupiny, lebo vlastne vsetky instrukcie sluzia na riadenie procesora. Do tejto skupiny sa vsak zaraduju iba tie instrukcie, ktore sa nehodia do ziadnej inej skupiny. Podobne, ked sa pozrieme na tretiu skupinu 'logicke instrukcie', moze nas napadnut otazka: "Ci su tie ostatne instrukcie nelogicke ?" Avsak my sa napadnutiu touto otazkou ubranime tvrdenim, ze ostatne instrukcie nie su nelogicke, to len instrukcie z tej 'logickej' skupiny su urcene na robenie takych cinnosti, ze najvhodnejsi nazov pre ne je prave 'logicke instrukcie'. Teraz si postupne popiseme kazdu spominanu skupinu instrukcii.

INSTRUKCIE NA RIADENIE CINNOSTI PROCESORA

   Do tejto funkcnej skupiny patria instrukcie priamo ovladajuce niektore priznaky a instrukcie umoznujuce ovladat niektore vnutorne mechanizmy procesora a jeho chovanie voci vonkajsiemu okoliu. Tieto instrukcie nemaju ziadne operandy.

   Instrukcie na ovladanie priznakov su zhrnute v nasledujucej tabulke:

NazovCinnost
CMCCF = not CF (negacia CF)
CLCCF = 0
STCCF = 1
CLDDF = 0
STDDF = 1
CLIIF = 0 (zakaz prerusenia)
STIIF = 1 (povolenie prerusenia)

Instrukcie ovladajuce niektore vnutorne stavy procesora su tieto:

   HLT ... (halt) zastavenie cinnosti procesora. Z tohto stavu je procesor mozne dostat iba resetom alebo nemaskovatelnym prerusenim (NMI), alebo aj maskovatelnym (INT), ale toto musi byt povolene (instrukciou STI).

   WAIT ... zastavenie cinnosti procesora - procesor nevykonava program, ale testuje stav na svojom vstupe WAIT. Po prichode aktivneho signalu na vstup WAIT procesor pokracuje vo vykonavani programu. Pokym je procesor v stave WAIT a pride vonkajsie prerusenie (a ak nie je zakazane), procesor po vykonani obsluznej rutinky prerusenia a navrate z nej stale zostava v tomto stave. Tato instrukcia v spolupraci so vstupom WAIT sluzi na synchronizaciu chodu procesora s vonkajsimi obvodmi.

   ESC ... umoznuje spolupracujucim procesorom (napr. 8087 alebo 8089) nacitavat svoje instrukcie z prudu instrukcii procesora 8086 a mohli vyuzivat jeho adresovanie rezimy. Vtedy 8086 vlastne len nacita prislusny operand z pameti a ine operacie nevykonava.

   LOCK ... rezervacia zbernice. Toto je vlastne ani nie je instrukcia, ale akasi predpona, ktora sa moze pouzit pred lubovolnou inou instrukciou. Jej pouzitie sposobi, ze procesor pocas vykonavania tejto instrukcie vysle signal rezervacie systemovej zbernice a vtedy zbernica nemoze byt pridelena inemu procesoru, ktory zdiela tuto zbernicu. LOCK sa pouziva pri programovani viacprocesorovych systemov.

ARITMETICKE INSTRUKCIE

   Instrukcie v tejto funkcnej skupine su urcene na vykonavanie styroch zakladnych matematickych operacii (scitanie, odcitanie, nasobenie, delenie), desiatkovych korekcii pre cisla v rozvinutom alebo kompaktnom dekadickom tvare a znamienkovych rozsireni. Operacie mozu byt vykonavane nad 8 aj 16 bitovymi hodnotami a nad hodnotami v priamom alebo doplnkovom kode [so znamienkom].

   Vsetky aritmeticke instrukcie ovplyvnuju podla vysledku operacie sest priznakov v priznakovom registri. Vo vseobecnosti platia nasledovne pravidla (pokial to nebude pri konkretnych instrukciach uvedene inak):

CF je nastaveny ak sa vysledok N-bitovej operacie [N=8 alebo 16] operacie v priamom kode nezmesti do N bitov. Je to vlastne prenos z najvyssieho dvojkoveho radu vysledku.
AF je nastaveny, ak vznikne prenos medzi 3. a 4. bitom 8-bitoveho vysledku.
ZF je nastaveny, ak vysledok operacie je rovny nule, t.j. vsetky bity vysledku su nulove.
SF sa nastavuje podla najvyssieho bitu vysledku - je to vlastne znamienko pri operaciach v doplnkovom kode.
PF je nastaveny, ak je parita dolneho bajtu vysledku parna.
OF je nastaveny, ak pri operacii doslo k prenosu do najvyssieho bitu vysledku (nie z najvyssieho bitu ako pri CF).

   Este pred tym ako si popiseme jednotlive instrukcie pre operacie, musime si objasnit co to znamena rozvinuty alebo kompaktny dekadicky tvar. Cislo je zapisane v rozvinutom dekadickom tvare vtedy, ak v kazdom bajte sa nachadza prave jedna dekadicka cislica. To ale znamena ze kolkociferne dekadicke cislo chceme zapisat, tolko bajtov na to potrebujeme. Priklad: Zapisme cislo 37 do registra AX. To znamena ze v registri AH bude hodnota 3 a v registri AL bude hodnota 7. Ak sa potom na hodnotu v AX pozrieme ako na celkom obycajne cislo, bude jeho hodnota (vyjadrena sestnastkovo) 0307h. Lenze ked sa nad tym dobre zamyslime, zistime, ze na ulozenie jednej dekadickej cislice je skoda minut vsetkych 8 bitov, pohodlne by nam stacili aj 4 bity. Inac povedane, do 8-bitoveho registra by sme mohli natlacit dve cislice naraz. A to prave vyuziva tzv. kompaktny dekadicky tvar. Majme teraz napriklad cislo 8086 a skusme ho zapisat do registra AX v tomto kompaktnom tvare. Potom vyssie 4 bity registra AH budu mat hodnotu 8, nizsie 4 bity AH budu obsahovat 0, vyssie 4 bity AL budu rovne 8 a v nizsich 4 bitoch AL bude zapisana hodnota 6. Kedze v sestnastkovej sustave priamo kazdej cislici zodpovedaju 4 bity celkovej hodnoty, potom obsah celeho akumulatora sestnastkovo zapisany ako normalne cislo v priamom kode bude 8086h.

Nazad na obsah , predchadzajuca a dalsia lekcia