Assembler | Číselné sústavy | Procesor 8086 | Registre procesora 8086
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 kiloba
jtový 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*10
4 + 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ť 2
20 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:
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í cykluInš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: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:ZF - ZERO FLAG
- je nastavený na 1 ak výsledok operácie je 0. Príklad: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: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,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.