Segment jest blokiem pamięci kodu lub danych, który tworzy asembler z kodu lub danych znajdujących się w pliku źródłowym. Użycie segmentów w module źródłowym jest zależne od złożoności aplikacji. Małe aplikacje wymagają mniejszej pamięci i są zwykle mniej złożone niż duże, wiclomodułowc aplikacje. Mikrokontroler MCS-51 ma kilka różnych, specyficznych dla siebie, przestrzeni pamięci, jak:
• pamięć kodu programu
• wewnętrzna pamięć danych adresowana bitowo, bezpośrednio lub pośrednio.
• zewnętrzna pamięć danych.
Segmenty są więc używane do umiejscowienia kodu programu, stałych i zmiennych w tych przestrzeniach.
2.1 Licznik położenia
Podczas swojej pracy program asemblujący (asembler) przyporządkowuje każdemu segmentowi tzw. licznik położenia, który jest wskaźnikiem adresu w przestrzał i aktywnego segmaita Adres tai jest adresan względnym dla scgmaitu rclokowalncgo lub adresem bezwzględnym (rzeczywistym) dla segmentu absolutnego. Kiedy dany segmait jest po raz pierwszy aktywowany, licznik położenia jest ustawiany na 0. Jego wartość jest zmieniana po przeanalizowaniu danej instrukcji o wartość związaną z jej implementacją w danym segmencie. Dyrektywy inicjalizacji i rezerwacji pamięci (np. DS. DB lub DBIT) zmieniają wartość licznika położaiia po przydzielaiiu pamięci przez tą dyrektywę. Dyrektywa ORG ustala nową wartość dla licznika położaiia. Jeśli nastąpi zmiana aktywnego segmait na inny. a polan powrót do niego, to licznik położenia przyjmuje taką wartość, jaką miał ostatnio przy korzystaniu z danego scgmaitu. Zawrze, kiedy asanbler napotka etykietę, przypisuje jej bieżącą wartość licznika położaiia i typ bieżącego scgmaitu dla tej etykiety.
Znak dolara ($) sygnalizuje wartość licznika położenia w aktywnym segmaicie. Kiedy używa się symbolu $. należy pamiętać, że jego wartość zmiaiia się z każdą instrukcją, lecz tylko po tym. jak instmkcja ta zostanie całkowicie zanalizowana pizcz asanbler. Jeśli użyje się znaku S w miejscu operandu instrukcji lub dyrektywy', to reprezentuje on wtedy adres pierwszego bajta tej instrukcji.
2.2 Segmenty bezwzględne (absolutne)
Segmaity absolutne rezydują w określonym typie pamięci pod stałym adresan ustalanym przez programistę na poziomie pisania kodu programu. Są tworzone przy użyciu dyrektyw: CSEG. BSEG. dseg. ISEG i xseg Wymienione dyrektywy umożliwiają umieszczanie kodu i danych lub rczciwację pizcstrzaii pamięci pod określonym adresan. Segmaity absolutne są używane wtedy, gdy istnieje konieczność posiadania dostępu do stałego miejsca w pamięci lub umieszczana kodu lub stałych od określonego adresu.
Po resecie mikrokontroler rozpoczyna wykonywanie programu od adresu 0. Jeśli właściwy program nic zaczyna się od tego adresu, to pod nim musi być umieszczona co najmniej jedna instrukcja, która przekiauje wykonywanie programu pod właściwy adres. Aby wymusić umieszczaiie kodu programu od innego adresu należy wykorzystać segmaity' absolutne. Poniższy przykład przedstawia fragment programu, gdzie wymuszono w początkowej fazie jego wykonywania, skok do podprogramu inicjalizującego, który jest umieszczony w dalszej części pamięci kodu.
CSEG AT 0
RESET VECT: LJMP STARTUP
Kod programu, który został umieszczony od adresu 0000H za pomocą dyrektywy CSEG AT 0 wykonuje operację skoku pod etykietę STARTUP.
Dyrektywy BSEG. CSEG. DSEG. ISEG. XSEG określają adres bezwzględny w odpowiednim segmencie progr amu, od którego będą umieszczane instrukcje występujące po tej dyrektywie. Adr es segmentu jest więc ustalany przez programistę już w chwili pisania progr amu. Omawiane dyrektywy mają następujący fonnat:
BSEG |
AT |
adres |
/definiuje bezwzględny adres |
w |
segmencie |
BIT |
CSEG |
AT |
Adres |
/definiuje bezwzględny adres |
w |
segmencie |
CODĘ |
DSEG |
AT |
Adres |
/definiuje bezwzględny adres |
w |
segmencie |
DATA |
ISEG |
AT |
Adres |
/definiuje bezwzględny adres |
w |
segmencie |
XDATA |
XSEG |
AT |
Adres |
/definiuje bezwzględny adres |
w |
segmencie |
IDATA |