Štruktúra | Union | Bitové pole
Na zápis textov, premenných, znakov, číselných hodnôt sa v dátovom segmente používajú tieto direktívy:
DB, DW, DD, DF, DP, DQ, DT. Syntax: [meno] direktíva [výraz],[výraz]...[Meno] je identifikátor, ktorý označuje pamäťové miesto. Meno okrem adresy obsahuje aj informáciu o veľkosti dát. Túto veľkosť určuje [Direktíva] (viď tabuľka). [Výraz] - slúži na definovanie obsahu pamäťového miesta.
DIREKTÍVA |
VEĽKOSŤ (v bajtoch) |
ROZSAH |
DB |
1 |
-128 až 255 |
DW |
2 |
-32768 až 65535 |
DD |
4 |
-2 146 483 648 až 4 294 967 295 |
DF |
6 |
-247 až 248-1 |
DP |
6 |
-247 až 248-1 |
DQ |
8 |
-263 až 264-1 |
DT |
10 |
-279 až 280-1 |
Direktíva DB
sa vyznačuje tým, že ako výraz môžete použiť aj ľubovolne dlhý textový reťazec, ktorý musí byť uzavretý v apostrofoch alebo v úvodzovkách. Po preklade prekladačom sa jednotlivé znaky nahradia číselnými hodnotami ASCII, pričom pre každý znak sa alokuje miesto o veľkosti 1 bajt. DW - výraz je 16-bitová hodnota, alebo reťazec dlhý max. 2 znaky. DD - výraz je 32-bitová hodnota, alebo reťazec dlhý max. 4 znaky. DF a DP sa používajú k definovaniu 48-bitovej FAR adresy. Sú využiteľné až od procesora 386. Výraz môže byť aj reťazec, dlhý max. 6 znakov. DQ - direktíva sa používa pre 64-bitové reálne čísla, prípadne pre reťazec dlhý max. 8 znakov. DT - sa používa pre reálne čísla. Výraz môže byť aj reťazec dlhý max. 10 znakov. V bežnej programátorskej praxi sa najčastejšie stretnete s direktívami DB, DW a DD. V nasledujúcom príklade si ukážeme ako treba definovať tieto direktívy v dátovom segmente. Príklad:
.DATA |
|
;Začiatok dátového segmentu. |
|
TEXT |
DB 'Hello, World ! ' |
N |
DB "Computer" |
Á |
DB 100,99,88,-30 |
V |
DB 10 DUP ('PC-REVUE') |
E |
DW 16384,65535 |
S |
DD 0,0,0,0 |
T |
DF '123456' |
I |
DP '123456' |
E |
DB 10,10,"COFAX'97" |
PI |
DQ 3.1415927 |
EX1 |
DT 2.718281828 |
Doposiaľ sme sa zaoberali len jednoduchými dátami. Prekladač assembleru však dovoľuje používať aj zložené dáta. Sem patria napr.: štruktúry, uniony, bitové polia a tabuľky. Medzi najčastejšie používané zložené dáta patria štruktúry (rozoberieme si ich podrobnejšie).
Štruktúra
je zložená z jedného alebo niekoľkých prvkov. Definovanie štruktúry prebieha v dvoch fázach. V prvej fáze sa nadefinuje šablóna štruktúry, resp. jej jednotlivé prvky. V druhej dochádza k definovaniu premennej typu štruktúra, resp. k inicializácii jednotlivých prvkov štruktúry.Syntax:
[meno] STRUC
...
prvky štruktúry
...
[meno] ENDS
Identifikátor [meno]
je názov nového dátového typu, ktorý je možné používať pri definovaní premenných rovnako ako direktívy DB, DW, DD a pod. Prvky štruktúry predstavujú jednoduché, alebo zložené typy dát. Jednotlivé prvky štruktúry sa do pamäti ukladajú v takom poradí v akom sú definované v danej štruktúre. Syntax inicializácie prvkov štruktúry je nasledovná:[meno_prem] MENO ŠTRUKTÚRY [inicializácia],[inicializácia],...
Identifikátor [meno_prem] je meno premennej typu štruktúra. MENO ŠTRUKTÚRY je meno, ktorým sme pomenovali našu štruktúru. Pre inicializáciu
štruktúry je možné použiť tieto hodnoty.1. ? (otáznik znamená - nedefinovaný obsah)
2. <>
(hranaté zátvorky znamenajú, že sa použije obsah, ktorý bol nadefinovaný pri vytvorení štruktúry)3. <hodnota,hodnota,...>
(takto je možné nadefinovať štruktúru novými hodnotami). Inicializačné hodnoty sú oddelené čiarkami. V prípade, že si prajete nechať nejaký prvok štruktúry implicitne nastavený, stačí ak namiesto hodnoty prvku vložíte iba čiarku. Príklad, ktorý si ukážeme vám všetko ozrejmí.4. {prvok1=hodnota,prvok2=hodnota,...}
V zložených zátvorkách sa uvádzajú len tie prvky, ktoré chceme naplniť, na poradí prvkov nezáleží.5. počet
DUP (hodnota)Prístup k jednotlivým prvkom štruktúry je zabezpečený pomocou znaku '.' (bodka).
Syntax: meno_prem.meno_prvku
Dosť bolo teórie, lepšie to pochopíte na príklade.
Príklad:Union
je zložený dátový typ podobný štruktúre. Platia preň všetky pravidlá, ktoré sme si popísali u štruktúr. Šablóna sa definuje medzi kľúčovými slovami UNION a ENDS. Union sa odlišuje od štruktúr najmä tým, že umožňuje rôzny prístup k jednému pamäťovému miestu. Skladá sa podobne ako štruktúra z viacerých prvkov, ktoré neukladá do pamäti za sebou, ale cez seba. To znamená, že relatívne posunutie u každého prvku je nula a celková dĺžka unionu je rovná dĺžke najdlhšieho prvku.Bitové pole
sa napr. od štruktúry výrazne odlišuje v tom, že prvky poľa sú zložené z bitov. Bitové pole sa používa tam, kde chceme skrátiť dĺžku programu a tým šetriť pamäť. Tiež sa môže použiť pre čísla, ktoré sa vojdú do menšieho počtu bitov než osem.Syntax: [meno] RECORD prvok1,prvok2,...
Identifikátor [meno]
sa používa všade tam, kde chceme vyhradiť pamäť v tomto bitovom formáte. Jednotlivé prvky zapisujeme v tvare:[meno_prvku]:[veľkosť_prvku]=[inicializácia]
Príklad:FLAG RECORD A:1=0,B:1=0,C:1,D:1,E:1,F:1
[veľkosť_prvku]
je veľkosť v bitoch. [inicializácia] je hodnota bitu, alebo celku bitov. Pre [inicializáciu] môžete použiť takmer všetko, čo platí pre štruktúry. Celková veľkosť poľa je daná celočíselným násobkom bajtu (viď tabuľka).
Bajty |
Bity |
1 |
0..7 |
2 |
8..15 |
3 |
16..23 |
4 |
24..31 |
Z tabuľky vyplýva, že celková veľkosť poľa, t.j. súčet veľkostí všetkých prvkov, nesmie prevýšiť 32 bitov. Naše pole FLAG má veľkosť 6 bitov, resp. jeden bajt. Prvky poľa sú v pamäti uložené takto:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
F |
E |
D |
C |
B |
A |
? |
? |
Nižšie bity bajtu obsadia vždy nedefinované resp. nepoužité bity (?), ďalšie bity obsadzujú jednotlivé prvky poľa, tak ako boli definované. Pole je vždy brané ako celok. Ak chceme pracovať s jednotlivými prvkami, je potrebné použiť maskovanie poľa (direktíva MASK) a posuv. K tomu môžete použiť napríklad tieto inštrukcie: AND, OR, SHL, SHR a pod.
Príklad:
.model tiny |
|
.code |
|
org 100h |
|
start: |
jmp bit |
flag |
record A:1,B:1,C:1,D:1,E:1,F:1 |
znak |
flag <0,0,0,0,0,0> |
znak1 |
flag {a=1,f=0} |
bit: |
mov al,flag <1,1,,,1,1> |
|
int 20h |
|
end start |
Dostávame sa k poslednému dátovému typu. Je ním tabuľka (
TABLE). Tento typ predstavuje tabuľku hodnôt (najčastejšie adresy procedúr). Typ TABLE bol zavedený hlavne v súvislosti s implementáciou objektov, kde sa používa pre reprezentáciu tabuľky metód objektov. Podrobnejšie o tomto type v kapitole Objektové programovanie.