Vytváranie segmentov

Program v assembleri je tvorený segmentami, ktoré obsahujú kód, dáta a zásobník. Tieto segmenty môžeme v zdrojovom texte definovať pomocou direktívy SEGMENT.

Syntax:
[meno] SEGMENT [umiestnenie] [kombinácia] [veľkosť] [trieda]

...

[meno] ENDS ;Koniec segmentu

Meno - definuje názov segmentu. Umiestnenie - určuje ako bude vyzerať segmentová adresa. Môžete použiť tieto voľby: BYTE (segment začína na ľubovoľnej adrese), WORD (segmentová adresa končí na adrese deliteľnej 2), DWORD (segmentová adresa končí na adrese deliteľnej 4), PARA (segmentová adresa končí na adrese deliteľnej 16 - táto voľba je štandartne nastavená prekladačom), PAGE (segmentová adresa končí na adrese deliteľnej 256), MEMPAGE (segmentová adresa končí na adrese deliteľnej 2048). Kombinácia - určuje ako bude segment kombinovaný so segmentami iných programových modulov. Pre určenie kombinácie môžete použiť nasledujúce voľby: PUBLIC (všetky segmenty, ktoré majú rovnaké meno budú spojené do jedného segmentu), STACK (podobne ako u voľby PUBLIC). Veľkosť - voľba vyjadruje veľkosť segmentu. Môže byť použitá iba vtedy, ak je povolený procesor 80386 direktívou .386. Máme k dispozícii tieto voľby: USE16 (segment môže obsahovať 64KB kódu alebo dát), USE32 (segment môže obsahovať 4GB kódu alebo dát). TRIEDA - sa používa pre identifikáciu segmentu, ktorý má byť umiestnený do rovnakých pamäťových miest ako ostatné segmenty tej istej triedy. Pre označenie triedy je možné použiť ľubovolné slovo, ktoré musí byť umiestnené v apostrofoch, alebo v úvodzovkách.

Príklad:

code

SEGMENT PUBLIC "CODE"

 

ASSUME CS:code, DS:data, SS:zasobnik

 

MOV AX,4C00h

 

INT 21h

code

ENDS

data

SEGMENT PUBLIC "DATA"

 

db 10,20,30

data

ENDS

zasobnik

SEGMENT STACK "STACK"

 

dw 200 DUP (?)

zasobnik

ENDS

 

END

Segmenty budú v pamäti uložené v takom poradí ako sú definované v zdrojovom texte. Code segment musí byť definovaný ako prvý, pretože program sa spustí od začiatku. Ak by ste dali prvý zásobníkový alebo dátový segment procesor by začal spracovávať nezmyselné postupnosti inštrukcii. Pre ďalšie operácie so segmentami môžete použiť tieto direktívy: GROUP, ASSUME, SEG.

Syntax: [meno] GROUP [meno_seg], [meno_seg] ...

Direktíva GROUP spojí pod jedno meno viac rôznych segmentov. Celková dĺžka všetkých segmentov nesmie prekročiť 64KB. Veľmi často sa takto spojujú dátové segmenty rôznych mien.

ASSUME - direktíva definuje závislosť segmentových registrov na segmente alebo skupine GROUP. Tým umožňuje prekladaču vytvoriť prefix pred inštrukciou. Direktívu ASSUME je vhodné použiť za každou inštrukciou, ktorá mení obsah segmentových registrov.

Syntax: ASSUME [seg_reg]:[meno], [seg_reg]:[meno] ...

Ako segmentový register môžete použiť CS, DS, SS, ES. Meno môže byť meno segmentu, alebo skupiny GROUP.

SEGCS, SEGDS, SEGSS, SEGES - tieto direktívy sa používajú pre zmenu segmentovej závislosti. Táto zmena platí vždy pre nasledujúci riadok v zdrojovom súbore (viď príklad). Posledné dve písmená direktívy označujú, ktorý segmentový register sa použije.

Príklad:

ASSUME CS:code, DS:data

SEGCS

MOV [BX],AX

...

Inštrukciu MOV [BX],AX prekladač preloží ako MOV CS:[BX],AX.