ZÁKLADNÉ POJMY

Assembler | Číselné sústavy | Procesor 8086 | Registre procesora 8086

Assembler

Assembler je materským jazykom procesora. Procesor rozumie assembleru vo forme postupnosti núl a jednotiek. Tejto forme hovoríme strojový kód (anglicky machine code). Pretože tvoriť programy priamo v niektorej z číselných sústav (binárnej, dekadickej, hexadecimálnej) by bolo náročné, zaviedla sa jednoduchšia forma zápisu. Nazývame ju symbolický zápis inštrukcií. Z nasledujúcej tabuľky sa možete dozvedieť akým číslom niektorej z číselných sústav sa dá nahradiť daná inštrukcia.

SYMBOLICKÝ ZÁPIS

DEC

HEX

BIN

CLI

250d

0FAh

11111010b

STI

251d

0FBh

11111011b

Možno sa zamyslíte nad tým, prečo assembler používať, keď máme dostupné iné vyššie programovacie jazyky ako PASCAL, TURBOC, C++ atď. Dôvodov môže byť niekoľko. V žiadnom z vyšších programovacích jazykov nedosiahnete naprogramovanie takého programu, ktorý by bol rýchly a zároveň v pamäti zaberal čo najmenej miesta. Program v assembleri je možné jednoducho prenášať medzi rôznymi typmi počítačov. Výhodou tiež je, že máte úplnú kontrolu nad programom.

Pri niekoľkých inštrukciach (5 až 10) možno písať assembler i priamo v číslach. Umožňoval to už PASCAL 4.0, ktorý mal na to vytvorený príkaz INLINE. Na druhej strane sami uznáte, že napísať takto 1 až 2 kilobajtový program by bolo hotové trápenie.

I assembler má svoje mínus. Zdrojový text je i pri krátkom programe veľmi dlhý. V assembleri sa ťažšie hľadajú chyby. Programovanie aplikácií zaberie oveľa viac času ako pri vyšších programovacích jazykoch. Assembler napriek svojim kladným vlastnostiam slúži aj ako nástroj zlomyselnosti. Mám na mysli písanie vírov. Prevažná väčšina týchto programov je napísaná práve v assembleri.


Číselné sústavy

V assembleri pri písaní zdrojového textu je možné používať tieto tri základné číselné sústavy - binárnu, dekadickú, hexadecimálnu. Rozoberieme si ich podrobnejšie.


Binárna sústava

Základom binárnej sústavy je číslo 2. V tejto sústave môžu nastať dva rôzne stavy. Sú to stavy 0 a 1. Na identifikáciu čísel v binárnej sústave budeme používať na konci čísla znak b (všimnite si, že ide o prvé písmeno v slove binárna, podobne to bude aj s dekadickou a hexadecimálnou sústavou).

Napr. 01100100b = 100d

Skúsme si toto tvrdenie overiť.

(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 vyplýva, že jednotlivé rády sú vlastne mocniny čísla dva (1, 2, 4, 8, 16, 32, 64, 128,...). Pokúsme sa teraz urobiť prevod čísla 100 naspäť do binárnej sústavy.

Číslo, ktoré prevádzame delíme číslom 2. Pritom ak výsledkom delenia je celá časť označíme tento stav hodnotou 0. V prípade, že výsledkom delenia je číslo s desatinnou časťou označíme tento stav hodnotou 1. Desatinnú časť čísla "odsekneme" a pokračujeme v delení až kým nedosiahneme nulu.

Postup výpočtu

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 získané binárne číslo teraz usporiadame zdola nahor. 01100100b - dostali sme opäť naše pôvodné číslo. Jednotlivé číslice v binárnom zápise budeme nazývať bity. Osem takto za sebou idúcich bitov nazveme byte (bajt). Pretože aj byte je svojím obsahom malý, používa sa dnes bežne predpona kilo, mega, giga.

Jeden byte - 07 bit 110010 00 bit b

Prvý bit sprava sa označuje ako najnižší bit, má poradové číslo nula. Posledný bit sprava má poradové číslo sedem a nazývame ho najvyšší bit.

Binárna sústava sa najčastejšie používa pri logických inštrukciách a pri práci s grafikou.


Decimálna sústava

Základom dekadickej sústavy je číslo 10. Tiež si môžete všimnúť, že 10 je aj počet čísiel, ktoré táto sústava používa - to platí všeobecne. Čísla dekadickej sústavy budeme označovať na konci čísla znakom d.

Číslo 65535d sa dá napísať ako: 6*104 + 5*103 + 5*102 + 3*101 + 5*100 =

= 6*10000 + 5*1000 + 5*100 + 3*10 + 5*1 = 65535d

Dekadickú sústavu používame takmer každý deň (v škole, v práci atď), no pre assembler je oveľa výhodnejší nasledujúci typ sústavy.


Hexadecimálna sústava

Základom je číslo 16. Čísla tejto sústavy budeme označovať na konci čísla znakom h. Číslice väčšie ako deväť sa však nedajú zapísať jedným znakom a preto bola vytvorená dohoda, že sa budú označovať prvými šiestimi písmenami abecedy. To akú hodnotu nadobúdajú tieto písmená v iných sústavách môžete vidieť z tabuľky.

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

Výhodou hexadecimálnej sústavy je, že ak číslo 304Ah zapíšeme napríklad do 16-bitového registra AX (tento register sa dá rozdeliť na dva 8-bitové registre), potom v registri AH bude hodnota 30h a v registri AL hodnota 4Ah. Skúsme teraz číslo 304Ah previesť do dekadickéj sústavy.

3*163 + 0*162 + 4*161 + 10*160 = 12288 + 0 + 64 + 10 = 12362d

Opačný prevod, späť na hexadecimálne číslo je podobný tomu pre binárnu sústavu.

Výpočet

Zvyšok

HEX

12362 / 16 = 772

10

A

772 / 16 = 48

4

4

48 / 16 = 3

0

0

   

3

Ak nám pri delení vyjde číslo menšie ako 16, potom toto číslo pripíšeme na koniec hexadecimálneho čísla. Číslo, ktoré sme takto dostali prepíšeme zdola nahor takto: 304Ah. Dostali sme opäť naše pôvodné číslo.

Ešte jedna dôležitá vec. V zdrojovom texte sa musí pred hexadecimálnu číslicu, ktorá začína písmenom písať znak 0, inak prekladač bude hlásiť chybové hlásenie Undefined symbol.

Napríklad:

0A000h

A000h

dobre

zle


Procesor 8086

Procesor 8086 je prvým procesorom firmy INTEL. Má 14 16-bitových registrov. Vyššie procesory (286, 386,...) sú s ním kompatibilné. To znamená, že programy napísané pre tento procesor pôjdu rovnako spustiť aj na vyšších procesoroch. Procesor umožňuje adresovať 220 pamäťových miest, alebo inak povedané 1MB fyzickéj pamäti.


Registre procesora 8086

Registre si je možné predstaviť ako špeciálne pamäťové miesta, umiestnené priamo v procesore. Sú oveľa rýchlejšie ako bežná pamäť RAM. Procesor v nich uchováva hodnoty, s ktorými práve pracuje. Procesor disponuje 14-timi 16-bitovými registrami. Registre rozdeľujeme podľa použitia na:

1. všeobecné registre,
2. registre pre špeciálne účely,
3. segmentové registre,
4. riadiace registre.


Všeobecné registre

16-bitové registre

AX

BX

CX

DX

AH

AL

BH

BL

CH

CL

DH

DL

8-bitové registre

Každý zo všeobecných registrov sa dá rozdeliť na dva 8-bitové registre, pričom polovica 16-bitového registra označená H je horných osem bitov a polovica označená L je dolných osem bitov (viď tabuľka).

AX - ACCUMULATOR - register AX nachádza časté použitie v matematických operáciách.

BX - BASE - používa sa pri nepriamom adresovaní.

CX - COUNTER - register CX býva naplnený hodnotou, ktorá najčastejšie predstavuje:

1. počet opakovaní cyklu
2. počet presunov (REP MOVSB)

Inštrukcia REP MOVSB slúži ku kopírovaniu bloku pamäti (vysvetlená bude ďalej).

DX - DATA - register slúži na uchovávanie dát.


Registre pre špeciálne účely

SI

DI

BP

SP

SI - SOURCE INDEX - register sa využíva pri indexovom adresovaní.

DI - DESTINATION INDEX - podobne ako register SI.

BP - BASE POINTER - adresácia parametrov a lokálnych premenných na zásobníku.

SP - STACK POINTER - ukazovateľ na zásobník (OFFSET).


Segmentové registre

CS

DS

ES

SS

CS - CODE SEGMENT - segmentová časť adresy kde je uložený program, ktorý sa bude vykonávať.

DS - DATA SEGMENT - segment určuje blok v pamäti, v ktorom sa nachádzajú data programu (napr.: číselné hodnoty, reťazce, premenné, bufer, konštanty a pod.).

ES - EXTRA SEGMENT - pomocný segmentový register.

SS - STACK SEGMENT - segmentová časť adresy zásobníka. Registre SS:SP dávajú dohromady adresu, na ktorej sa v pamäti nachádza zásobník.


Riadiace registre

IP

F

IP - INSTRUCTION POINTER - register obsahuje ofset adresy práve vykonávanej inštrukcie. Celá adresa je daná obsahmi registrov CS:IP. Obsah registra IP nie je možné meniť priamo. Zmenu je možné vykonať iba inštrukciami skoku (JMP), volaním podprogramu (CALL), návratom z podprogramu (RET), návratom z prerušenia (IRET).

F - FLAGS - je to 16-bitový register, ktorý obsahuje informácie o výsledku vykonaných inštrukcií. Procesor 8086 využíva však iba 9 bitov z tohto registra. Ďalšie bity sa začali používať až od procesora 286. Nám však bude postačovať týchto 9 základných bitov.

15

...

0

 

 

 

 

OF

DF

IF

TF

SF

ZF

 

AF

 

OF

 

CF

OF - OVERFLOW FLAG - príznak sa nastaví, ak pri aritmetických operáciach došlo k pretečeniu výsledku.

Príklad:
MOV AL,255d ;naplň reg. AL číslom 255
MOV BL,255d ;naplň reg. BL číslom 255
MUL BL          ;vynásob tieto dve čísla

Po vykonaní inštrukcie násobenia sa výsledok 65025 už nevojde do 8-bitového registra, dôjde k pretečeniu a nastaví sa príznak OF.

DF - DIRECTION FLAG - tento príznak riadi smer spracovania reťazcových operácií. Pri DF nastavenom na jednotku inštrukciou STD sa obsah registrov SI a DI dekrementuje (reťazce sa spracovávajú odpredu), pri DF nastavenom na nulu inštrukciou CLD sa registre SI a DI inkrementujú (reťazce sa spracovávajú odzadu).

IF - INTERRUPT ENABLE FLAG - obsahuje stav maskovateľného prerušenia. Ak je nastavený na nulu, prerušenie je zakazané, v opačnom prípade je povolené (IF=1). Tento bit je možné nulovať inštrukciou CLI, alebo nastaviť na jednotku inštrukciou STI.

TF - TRAP FLAG - príznak sa používa pre účely ladenia programov. Jeho nastavenie spôsobí, že procesor po vykonaní každej inštrukcie vygeneruje prerušenie INT 1.

SF - SING FLAG - určuje či je výsledok operácie záporný. Ak je príznak nastavený na jedničku (SF=1) výsledok operácie je záporný, v opačnom prípade kladný (SF=0).

Príklad:
MOV AL,100d ;naplň reg. AL číslom 100
MOV BL,200d ;naplň reg. BL číslom 200
SUB AL,BL      ;odčítaj tieto dve čísla

ZF - ZERO FLAG - je nastavený na 1 ak výsledok operácie je 0.

Príklad:
MOV AL,100d ;naplň reg. AL číslom 100
MOV BL,100d ;naplň reg. BL číslom 100
SUB BL,AL      ;odčítaj tieto dve čísla

AF - AUXILIARY FLAG - AF=1 ak došlo k prenosu z bitu 3 do bitu 4 bez ohľadu na dľžku operandu. Používa sa v BCD aritmetike.

PF - PARITY FLAG - je nastavený na 1 ak dolných osem bitov výsledku vykonávanej operácie obsahuje párny počet jednotiek (POZOR - neznamená to, že číslo je párne!).

CF - CARRY FLAG - príznak je nastavený na jednotku, ak došlo k prenosu cez najvyšší bit.

Príklad:
MOV AL,100d ;naplň reg. AL číslom 100
MOV AH,200d ;naplň reg. AH číslom 200
ADD AH,AL     ;spočítaj tieto dve čísla

Ak sčítame tieto dve čísla dostaneme výsledok 300, ale tento výsledok už nie je možné uložiť naspäť do 8-bitového registra. Dôjde k pretečeniu a nastaví sa príznak CF=1 a výsledok bude 44.

Hodnotu príznaku je možné meniť tiež nasledujúcimi inštrukciami:

STC - nastaví hodnotu carry flagu na 1,
CLL - vynuluje carry flag.

Príznaky CF, PF, AF, ZF, SF, OF nastavuje procesor po vykonaní niektorých inštrukcií. Príznaky TF, IF, DF nastavuje programátor a slúžia k riadeniu činnosti procesora.