46 4. Język asemblerowy mikroprocesorów 8086/8088
PARA - początek segmentu będzie miał najbliższy wolny adres podzielny bez reszty przez 16. Między dwoma segmentami (tj. końcem poprzedniego i początkiem następnego) może pozostać do piętnastu nie wykorzystanych bajtów. Jeżeli [typ] nie występuje w dyrektywie SEGMENT, to jest przyjmowany parametr PARA.
BYTE - początek nowego segmentu rozpocznie się bez odstępu po segmencie poprzednim, ponieważ początek nowego segmentu przyjmuje ostatni w poprzednim segmencie adres podzielny bez reszty przez 16. Adres ten może być przemieszczony w głąb poprzedniego segmentu na odległość do piętnastu bajtów. Offset rozpoczyna się wtedy nie od zera, lecz od przemieszczenia równego liczbie tych bajtów.
WORD - początek segmentu jest określany podobnie jak dla typu BYTE, jednak tylko dla adresu parzystego. Między dwoma segmentami może być wtedy co najwyżej jeden bajt nie wykorzystany. Typ segmentu WORD ma znaczenie wyłącznie dla procesora 8086, gdy zależy nam aby, dostęp do 16-bitowcgo słowa był możliwy w jednym cyklu pamięci (por. p. 2.5).
PAGE - początek nowego segmentu rozpocznie się od najbliższego wolnego adresu podzielnego bez reszty przez 256. W zapisie szesnastkowym adres ten będzie kończyć się dwoma zerami 00H.
[połączenie] - argument informujący program łączący (p. 8.2) w jaki sposób i w jakiej kolejności segment ma być łączony z innymi segmentami. Jeżeli argument nie występuje (co jest przyjęte jako standard), to oznacza, że występujący segment jest lokalny i nie jest łączony z żadnym innym. W przypadku, gdy argument "połączenie" występuje, musi być podany przy pierwszej definicji tego segmentu i argument "połączenie" nie może być później (przy ponownym otwieraniu lego segmentu) zmieniany. Możliwych jest pięć rodzajów połączeń.
PUBLIC - połączenie z segmentami o tej samej nazwie występującymi w innych modułach i utworzenie jednego wspólnego segmentu. Wszystkie połączone segmenty mają wspólny adres początku segmentu, a offset zwiększa się począwszy od początku pierwszego segmentu aż do końca ostatniego. Należy pamiętać, że jeżeli równocześnie nie zostanie zadeklarowany typ BYTE, to wewnątrz tak utworzonego nowego segmentu mogą występować bajty o niezdefiniowanej zawartości.
z modułu 1: DANE SEGMENT PARA PUBLIC
ZMIENNASLOWO 1 DW 5555H ZMIENNA SLOWO_2 DW 8888H DANE ENDS
z modułu 2: DANE SEGMENT PARA PUBLIC
ZMIENNASL0W03 DW 4444H DANE ENDS
po połączeniu uzyska się następującą zawartość pamięci:
offset zawartość
(X)O0H-0003H 55558888H
0004H-000FH nieokreślona
0010H-0011H 4444H +
powered by
4.3. Dyrektywy i pseudoinstrukcje
COMMON - segmenty zdefiniowane jako COMMON, a mającc^^amłpi!^^^™ zwę są ładowane do pamięci z takim samym adresem początkowym segmentu. Wielkość tego segmentu po połączeniu jest równa wielkości największego z łączonych segmentów. Tak więc ten sam obszar pamięci operacyjnej może być w różnych modułach zdefiniowany za pomocą różnych zmiennych i etykiet. Inicjowanie takiego obszaru pamięci nie może odbywać się za pomocą konkretnych wartości zmiennych przypisywanych dyrektywami DB/DW.
SEGMENT COMMON DB?
DW?
DB?
ENDS
SEGMENT COMMON DW?
DW?
DW?
ENDS +
moduł 1: WSPOLNEDANE
ZMIENNA J ZMIENNA 2 ZMIENNA 3 WSPÓLNE DANE moduł 2: WSPÓLNE DANE
ZMIENNAl ZMIENNA2 ZMIENNA 3 WSPÓLNE DANE
W pamięci zostanie zarezerwowanych 6 bajtów, przy czym cztery pierwsze mogą być wykorzystywane w obu modułach.
AT ,wyrażenie numeryczne’ - segmenty z tym połączeniem są ładowane od adresu wskazanego przez wyrażenie numeryczne. Wartość wyrażenia musi być znana w czasie asemblacji i stanowi adres fizyczny podzielony przez 16 (na 16 bitach). Przykładowo segment rozpoczynający się dyrektywą
DANE SEGMENT AT 5432H
zostanie załadowany od adresu fizycznego 54320H. Dla programów uruchamianych pod kontrolą systemu MS-DOS użycie AT w segmencie programu jest niemożliwe.
STACK - wszystkie segmenty o tej samej nazwie i połączeniu STACK utworzą jeden wspólny stos o jednym adresie początkowym i o wielkości będącej sumą wszystkich łączonych segmentów. Jeżeli wielkość tego połączonego stosu jest mniejsza niż 512 bajtów, to program łączący powiększa go automatycznie do 512 bajtów. Przykładowo dla dwóch segmentów:
STOS SEGMENT STAĆ STOS SEGMENT STACK
DW 10 DUP (?) DW 22 DUP (?)
KONIECSTOSU LABEL WORD SZCZYT STOSU LABEL WORD STOS ENDS STOS ENDS
postanie utworzony wspólny stos o wielkości 32 bajtów. KONIECSTOSU * SZCZYT STOSU mają ten sam offset równy 42H (dziesiętnie 10 + 22).
MEMORY - połączenie podobne jak COMMON, lecz segment zostanie umieszczony na końcu łączonego programu. W programie źródłowym może wystąpić tylko jedna nazwa z segmentem MEMORY. Jeżeli wystąpi ich więcej, to drugi i nas-