48 4. Język asemblerowy mikroprocesorów 8086/8088
tępne segmenty będą łączone jak COMMON, a informacja o tym zostanie przekazana programiście w postaci ostrzeżenia.
[’nazwa_klasy’] - nazwa nie dłuższa niż 40 znaków umieszczona w apostrofach. Według ’nazwy_klasy’ program łączący grupuje segmenty należące do różnych modułów. Za pomocą tego parametru nie da się uzyskać określonej kolejności klas ani też określonej kolejności segmentów w danej klasie. Dwa różne segmenty o tej samej nazwie ale różnej "nazwie klasy' nie da się połączyć za pomocą parametrów PUBLIC, STACK, COMMON lub MEMORY, (p. 8.2).
Jak już wspomniano, po zakończeniu jednego segmentu można w programie rozpocząć nowy segment o tej samej nazwie. Można też wewnątrz segmentu zdefiniować inny segment (musi on jednak w całości mieścić się w segmencie zewnętrznym). W tym przypadku segmenty po asemblacji zostaną ułożone jeden za drugim.
SEGMENT PARA
; treść programu i dane przypisane do I
; segmentu PROGRAM l • • •
ENDS
SEGMENT PARA
; dane przypisane do segmentu DANE l ENDS
SEGMENT BYTE ; treść programu i dane przypisane do ; segmentu PROGRAM 1 ; segment rozpocznie się po adresie ; symbolicznym ETYKIETA ENDS
SEGMENT PAGE
; program i dane w segmencie zewnętrznym SEGMENT
; program i dane w segmencie wewnętrznym ENDS
; dalszy ciąg segmentu zewnętrznego
ENDS ♦
Przykłady PROGRAMJ
ETYKIETA:
PROGRAM 1 DANE 1
DANE 1 PROGRAM 1
PROGRAM 1 PROGRAM 2
PROGRAM 3
PROGRAM 3
PROGRAM 2
Dyrektywa GROUP
Dyrektywa GROUP pozwala wszystkie segmenty - występujące jako jej argumenty - zgrupować w jeden 64 KB blok pamięci operacyjnej. Programista musi jednak sam kontrolować, czy łączna długość wszystkich grupowanych segmentów nie przekracza tej wielkości. Dyrektywa GROUP umożliwia uzyskanie programu wynikowego o maksymalnie zwartym kodzie. Na przykład adresy w rozkazach skoków między segmentami mogą być jedynie 16-bitowc (czyli tak jak rozkazy skoków wewnątrz segmen-
powered by
4.3. Dyrektywy> i pseudoinstrukcje
tu), podczas gdy normalnie w takim przypadku jest generowany pełny adres logiczny smagający 4 bajtów. Składnia dyrektywy GROUP jest następująca
nazwa GROUP lista nazw
przy czym lista nazw to lista nazw grupowanych segmentów lub wyrażeń w postaci:
SEG nazwa zmiennej, SEG etykieta. Operator SEG (zob. p. 4.4) generuje adres początku segmentu podzielony przez 16 (16 bitów), w którym została zdefiniowana wymieniona nazwa zmiennej lub etykieta.
Przykłady
GRUPADANYCH GROUPDANE 1, DANE 2, SEG ZMIENNA 57 PROGRAM GROUP PROGRAMA, EW 88, SEG START *
Dyrektywa ORG
Wskaźnik pozycji asemblera pełni w czasie asemblacji podobną rolę jak wskaźnik rozkazów 1P w czasie wykonywania programu. Wskaźnik rozkazów IP zawiera offset rozkazu, który będzie wykonywany jako następny. Podobnie wskaźnik pozycji asemblera zawiera offset rozkazu, który w następnej kolejności będzie pobrany do asemblacji. Asembler po napotkaniu dyrektywy SEGMENT definiuje nowy wskaźnik pozycji i ustawia go w stan 0. Asemblacja kolejnych bajtów powoduje zwiększanie zawartości wskaźnika pozycji o 1. Dyrektywa ENDS wstrzymuje zliczanie bajtów w danym wskaźniku pozycji aż do ewentualnego rozpoczęcia kolejnego segmentu o tej samej nazwie. Dyrektywa ORG pozwala zmienić zawartość wskaźnika pozycji w danej chwili. Przyjmuje on wartość określoną argumentem
ORG wyrażenie
przy czym wartość wyrażenia musi być liczbą całkowitą z przedziału [0,65535]. Jeżeli w wyrażeniu występują nazwy symboliczne, to muszą być one wcześniej zdefiniowane, przy czym nie mogą to być etykiety. Dyrektywa ORG nie może wystąpić wewnątrz struktury zdefiniowanej dyrektywami STRUC/ENDS (zob. p. 4.3.4).
Przykłady
PROGRAM SEGMENT
ORG 100H ; program rozpocznie siÄ™ od adresu
; 100H względem początku segmentu
•
’ Wskaźnik pozycji zostanie ustawiony na kolejny adres podzielny przez 16:
IF $ MOD 16 ; asemblacja warunkowa (zob. p. 4.3.5)
ORG $ - ($ MOD 16) +16 ENDIF
; wykona się gdy $ MOD 16 różne od zera
; koniec asemblacji warunkowej