Assembler | Ciselne sustavy | Procesor 8086 | Registre procesora 8086
Assembler je materskym jazykom procesora. Procesor rozumie assembleru vo forme postupnosti nul a jednotiek. Tejto forme hovorime strojovy kod (anglicky machine code). Pretoze tvorit programy priamo v niektorej z ciselnych sustav (binarnej, dekadickej, hexadecimalnej) by bolo narocne, zaviedla sa jednoduchsia forma zapisu. Nazyvame ju symbolicky zapis instrukcii. Z nasledujucej tabulky sa mozete dozvediet akym cislom niektorej z ciselnych sustav sa da nahradit dana instrukcia.
SYMBOLICKY ZAPIS |
DEC |
HEX |
BIN |
CLI |
250d |
0FAh |
11111010b |
STI |
251d |
0FBh |
11111011b |
Mozno sa zamyslite nad tym, preco assembler pouzivat, ked mame dostupne ine vyssie programovacie jazyky ako PASCAL, TURBOC, C++ atd. Dovodov moze byt niekolko. V ziadnom z vyssich programovacich jazykov nedosiahnete naprogramovanie takeho programu, ktory by bol rychly a zaroven v pamati zaberal co najmenej miesta. Program v assembleri je mozne jednoducho prenasat medzi roznymi typmi pocitacov. Vyhodou tiez je, ze mate uplnu kontrolu nad programom.
Pri niekolkych instrukciach (5 az 10) mozno pisat assembler i priamo v cislach. Umoznoval to uz PASCAL 4.0, ktory mal na to vytvoreny prikaz INLINE. Na druhej strane sami uznate, ze napisat takto 1 az 2 kiloba
jtovy program by bolo hotove trapenie.I assembler ma svoje minus. Zdrojovy text je i pri kratkom programe velmi dlhy. V assembleri sa tazsie hladaju chyby. Programovanie aplikacii zaberie ovela viac casu ako pri vyssich programovacich jazykoch. Assembler napriek svojim kladnym vlastnostiam sluzi aj ako nastroj zlomyselnosti. Mam na mysli pisanie virov. Prevazna vacsina tychto programov je napisana prave v assembleri.
Ciselne sustavy
V assembleri pri pisani zdrojoveho textu je mozne pouzivat tieto tri zakladne ciselne sustavy - binarnu, dekadicku, hexadecimalnu. Rozoberieme si ich podrobnejsie.
Binarna sustava
Zakladom binarnej sustavy je cislo 2. V tejto sustave mozu nastat dva rozne stavy. Su to stavy 0 a 1. Na identifikaciu cisel v binarnej sustave budeme pouzivat na konci cisla znak b (vsimnite si, ze ide o prve pismeno v slove binarna, podobne to bude aj s dekadickou a hexadecimalnou sustavou).
Napr. 01100100b = 100d
Skusme si toto tvrdenie overit.
(0*27)+(1*26)+(1*25)+(0*24)+(0*23)+(1*22)+(0*21)+(0*20)=0+64+32+0+0+4+0+0=100
Z toho vyplyva, ze jednotlive rady su vlastne mocniny cisla dva (1, 2, 4, 8, 16, 32, 64, 128,...). Pokusme sa teraz urobit prevod cisla 100 naspat do binarnej sustavy.
Cislo, ktore prevadzame delime cislom 2. Pritom ak vysledkom delenia je cela cast oznacime tento stav hodnotou 0. V pripade, ze vysledkom delenia je cislo s desatinnou castou oznacime tento stav hodnotou 1. Desatinnu cast cisla "odsekneme" a pokracujeme v deleni az kym nedosiahneme nulu.
Postup vypoctu |
Stav |
100 / 2 = 50 |
0 |
50 / 2 = 25 |
0 |
25 / 2 = 12.5 |
1 |
12 / 2 = 6 |
0 |
6 / 2 = 3 |
0 |
3 / 2 = 1.5 |
1 |
1 / 2 = 0.5 |
1 |
0 / 2 = 0 |
0 |
Takto ziskane binarne cislo teraz usporiadame zdola nahor. 01100100b - dostali sme opat nase povodne cislo. Jednotlive cislice v binarnom zapise budeme nazyvat bity. Osem takto za sebou iducich bitov nazveme byte (bajt). Pretoze aj byte je svojim obsahom maly, pouziva sa dnes bezne predpona kilo, mega, giga.
Jeden byte - 07 bit 110010 00 bit b
Prvy bit sprava sa oznacuje ako najnizsi bit, ma poradove cislo nula. Posledny bit sprava ma poradove cislo sedem a nazyvame ho najvyssi bit.
Binarna sustava sa najcastejsie pouziva pri logickych instrukciach a pri praci s grafikou.
Decimalna sustava
Zakladom dekadickej sustavy je cislo 10. Tiez si mozete vsimnut, ze 10 je aj pocet cisiel, ktore tato sustava pouziva - to plati vseobecne. Cisla dekadickej sustavy budeme oznacovat na konci cisla znakom d.
Cislo 65535d sa da napisat ako: 6*10
4 + 5*103 + 5*102 + 3*101 + 5*100 == 6*10000 + 5*1000 + 5*100 + 3*10 + 5*1 = 65535d
Dekadicku sustavu pouzivame takmer kazdy den (v skole, v praci atd), no pre assembler je ovela vyhodnejsi nasledujuci typ sustavy.
Hexadecimalna sustava
Zakladom je cislo 16. Cisla tejto sustavy budeme oznacovat na konci cisla znakom h. Cislice vacsie ako devat sa vsak nedaju zapisat jednym znakom a preto bola vytvorena dohoda, ze sa budu oznacovat prvymi siestimi pismenami abecedy. To aku hodnotu nadobudaju tieto pismena v inych sustavach mozete vidiet z tabulky.
HEX |
DEC |
BIN |
HEX |
DEC |
BIN |
|
0 |
0 |
0000 |
8 |
8 |
1000 |
|
1 |
1 |
0001 |
9 |
9 |
1001 |
|
2 |
2 |
0010 |
A |
10 |
1010 |
|
3 |
3 |
0011 |
B |
11 |
1011 |
|
4 |
4 |
0100 |
C |
12 |
1100 |
|
5 |
5 |
0101 |
D |
13 |
1101 |
|
6 |
6 |
0110 |
E |
14 |
1110 |
|
7 |
7 |
0111 |
F |
15 |
1111 |
Vyhodou hexadecimalnej sustavy je, ze ak cislo 304Ah zapiseme napriklad do 16-bitoveho registra AX (tento register sa da rozdelit na dva 8-bitove registre), potom v registri AH bude hodnota 30h a v registri AL hodnota 4Ah. Skusme teraz cislo 304Ah previest do dekadickej sustavy.
3*163 + 0*162 + 4*161 + 10*160 = 12288 + 0 + 64 + 10 = 12362d
Opacny prevod, spat na hexadecimalne cislo je podobny tomu pre binarnu sustavu.
Vypocet |
Zvysok |
HEX |
12362 / 16 = 772 |
10 |
A |
772 / 16 = 48 |
4 |
4 |
48 / 16 = 3 |
0 |
0 |
3 |
Ak nam pri deleni vyjde cislo mensie ako 16, potom toto cislo pripiseme na koniec hexadecimalneho cisla. Cislo, ktore sme takto dostali prepiseme zdola nahor takto: 304Ah. Dostali sme opat nase povodne cislo.
Este jedna dolezita vec. V zdrojovom texte sa musi pred hexadecimalnu cislicu, ktora zacina pismenom pisat znak 0, inak prekladac bude hlasit chybove hlasenie
Undefined symbol.Napriklad:
0A000h |
A000h |
dobre |
zle |
Procesor 8086
Procesor 8086 je prvym procesorom firmy INTEL. Ma 14 16-bitovych registrov. Vyssie procesory (286, 386,...) su s nim kompatibilne. To znamena, ze programy napisane pre tento procesor pojdu rovnako spustit aj na vyssich procesoroch. Procesor umoznuje adresovat 2
20 pamatovych miest, alebo inak povedane 1MB fyzickej pamati.Registre procesora 8086
Registre si je mozne predstavit ako specialne pamatove miesta, umiestnene priamo v procesore. Su ovela rychlejsie ako bezna pamat RAM. Procesor v nich uchovava hodnoty, s ktorymi prave pracuje. Procesor disponuje 14-timi 16-bitovymi registrami. Registre rozdelujeme podla pouzitia na:
16-bitove registre |
|||||||
AX |
BX |
CX |
DX |
||||
AH |
AL |
BH |
BL |
CH |
CL |
DH |
DL |
8-bitove registre |
Kazdy zo vseobecnych registrov sa da rozdelit na dva 8-bitove registre, pricom polovica 16-bitoveho registra oznacena H je hornych osem bitov a polovica oznacena L je dolnych osem bitov (vid tabulka).
AX - ACCUMULATOR
- register AX nachadza caste pouzitie v matematickych operaciach.BX - BASE
- pouziva sa pri nepriamom adresovani.CX - COUNTER
- register CX byva naplneny hodnotou, ktora najcastejsie predstavuje: 1. pocet opakovani cykluInstrukcia REP MOVSB sluzi ku kopirovaniu bloku pamati (vysvetlena bude dalej).
DX - DATA
- register sluzi na uchovavanie dat.Registre pre specialne ucely
SI |
DI |
BP |
SP |
SI - SOURCE INDEX - register sa vyuziva pri indexovom adresovani.
DI - DESTINATION INDEX - podobne ako register SI.
BP - BASE POINTER - adresacia parametrov a lokalnych premennych na zasobniku.
SP - STACK POINTER
- ukazovatel na zasobnik (OFFSET).Segmentove registre
CS |
DS |
ES |
SS |
CS - CODE SEGMENT - segmentova cast adresy kde je ulozeny program, ktory sa bude vykonavat.
DS - DATA SEGMENT
- segment urcuje blok v pamati, v ktorom sa nachadzaju data programu (napr.: ciselne hodnoty, retazce, premenne, bufer, konstanty a pod.).ES - EXTRA SEGMENT - pomocny segmentovy register.
SS - STACK SEGMENT
- segmentova cast adresy zasobnika. Registre SS:SP davaju dohromady adresu, na ktorej sa v pamati nachadza zasobnik.Riadiace registre
IP |
F |
IP - INSTRUCTION POINTER
- register obsahuje ofset adresy prave vykonavanej instrukcie. Cela adresa je dana obsahmi registrov CS:IP. Obsah registra IP nie je mozne menit priamo. Zmenu je mozne vykonat iba instrukciami skoku (JMP), volanim podprogramu (CALL), navratom z podprogramu (RET), navratom z prerusenia (IRET).F - FLAGS
- je to 16-bitovy register, ktory obsahuje informacie o vysledku vykonanych instrukcii. Procesor 8086 vyuziva vsak iba 9 bitov z tohto registra. Dalsie bity sa zacali pouzivat az od procesora 286. Nam vsak bude postacovat tychto 9 zakladnych bitov.
15 |
... |
0 |
|||||||||||||
OF |
DF |
IF |
TF |
SF |
ZF |
AF |
OF |
CF |
OF - OVERFLOW FLAG - priznak sa nastavi, ak pri aritmetickych operaciach doslo k preteceniu vysledku.
Priklad:Po vykonani instrukcie nasobenia sa vysledok 65025 uz nevojde do 8-bitoveho registra, dojde k preteceniu a nastavi sa priznak OF.
DF - DIRECTION FLAG
- tento priznak riadi smer spracovania retazcovych operacii. Pri DF nastavenom na jednotku instrukciou STD sa obsah registrov SI a DI dekrementuje (retazce sa spracovavaju odpredu), pri DF nastavenom na nulu instrukciou CLD sa registre SI a DI inkrementuju (retazce sa spracovavaju odzadu).IF - INTERRUPT ENABLE FLAG
- obsahuje stav maskovatelneho prerusenia. Ak je nastaveny na nulu, prerusenie je zakazane, v opacnom pripade je povolene (IF=1). Tento bit je mozne nulovat instrukciou CLI, alebo nastavit na jednotku instrukciou STI.TF - TRAP FLAG
- priznak sa pouziva pre ucely ladenia programov. Jeho nastavenie sposobi, ze procesor po vykonani kazdej instrukcie vygeneruje prerusenie INT 1.SF - SING FLAG
- urcuje ci je vysledok operacie zaporny. Ak je priznak nastaveny na jednicku (SF=1) vysledok operacie je zaporny, v opacnom pripade kladny (SF=0). Priklad:ZF - ZERO FLAG
- je nastaveny na 1 ak vysledok operacie je 0. Priklad:AF - AUXILIARY FLAG
- AF=1 ak doslo k prenosu z bitu 3 do bitu 4 bez ohladu na dlzku operandu. Pouziva sa v BCD aritmetike.PF - PARITY FLAG
- je nastaveny na 1 ak dolnych osem bitov vysledku vykonavanej operacie obsahuje parny pocet jednotiek (POZOR - neznamena to, ze cislo je parne!).CF - CARRY FLAG
- priznak je nastaveny na jednotku, ak doslo k prenosu cez najvyssi bit. Priklad:Ak scitame tieto dve cisla dostaneme vysledok 300, ale tento vysledok uz nie je mozne ulozit naspat do 8-bitoveho registra. Dojde k preteceniu a nastavi sa priznak CF=1 a vysledok bude 44.
Hodnotu priznaku je mozne menit tiez nasledujucimi instrukciami:
STC - nastavi hodnotu carry flagu na 1,Priznaky CF, PF, AF, ZF, SF, OF nastavuje procesor po vykonani niektorych instrukcii. Priznaky TF, IF, DF nastavuje programator a sluzia k riadeniu cinnosti procesora.