Zápis dát v assembleri

Š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:
.DATA
LIST STRUC
SEFREDAKTOR DB 9 DUP (?)
NAZOV_CASOPISU DB 8 DUP (?)
VYDAVATELSTVO DB 'PERFEKT'
ROK DW ?
CISLO_CASOPISU DB ?
LIST ENDS
;Tu dochádza k inicializácii štruktúry.
K0 LIST ?
K1 LIST <>
K2 LIST <'M. DROBNY','PC-REVUE',,1997,1>
K3 LIST {ROK=2000,CISLO_CASOPISU=12}
.CODE
;Načítanie prvku zo štruktúry.
MOV AH,[K2.CISLO_CASOPISU]
;Takto získame adresu začiatku reťazca "M. DROBNY" v pamäti.
MOV SI,OFFSET K2.SEFREDAKTOR
;Uloženie prvku do štruktúry.
MOV AX,1997
MOV [K0.ROK],AX

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.