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] ENDS
;Koniec segmentuMeno - 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.