ZAKLADNE POJMY

Assembler | Ciselne sustavy | Procesor 8086 | Registre procesora 8086

Assembler

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 kilobajtovy 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*104 + 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 220 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:

1. vseobecne registre,
2. registre pre specialne ucely,
3. segmentove registre,
4. riadiace registre.


Vseobecne registre

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 cyklu
2. pocet presunov (REP MOVSB)

Instrukcia 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:
MOV AL,255d ;napln reg. AL cislom 255
MOV BL,255d ;napln reg. BL cislom 255
MUL BL          ;vynasob tieto dve cisla

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:
MOV AL,100d ;napln reg. AL cislom 100
MOV BL,200d ;napln reg. BL cislom 200
SUB AL,BL      ;odcitaj tieto dve cisla

ZF - ZERO FLAG - je nastaveny na 1 ak vysledok operacie je 0.

Priklad:
MOV AL,100d ;napln reg. AL cislom 100
MOV BL,100d ;napln reg. BL cislom 100
SUB BL,AL      ;odcitaj tieto dve cisla

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:
MOV AL,100d ;napln reg. AL cislom 100
MOV AH,200d ;napln reg. AH cislom 200
ADD AH,AL     ;spocitaj tieto dve cisla

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,
CLL - vynuluje carry flag.

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.