MCS-51
Dyrektywy asemblerowe

Rezerwacja pamięci

Dyrektywy rezerwacji pamięci w obszarze pamięci danych są używane do rezerwacji przestrzeni jednostkami o rozmiarze jednego bajta, słowa (2 bajty), bitu lub ich wielokrotności. Rezerwacja przestrzeni rozpoczyna się w punkcie wskazywanym przez bieżącą wartość licznika położenia w obecnie aktywnym segmencie.

DBIT

Implementacja: ASEM-51, Keil

Dyrektywa DBIT rezerwuje przestrzeń w segmencie danych adresowanych bitowo. Jej format jest następujący:

etykieta:  DBIT  wyrażenie
  • etykieta jest symbolem, który określa adres w rezerwowanej pamięci. Etykieta jest symbolem typu BIT i pobiera bieżącą wartość adresu oraz klasę pamięci aktywnego segmentu. Etykieta ta może być użyta wszędzie tam, gdzie dopuszczalne jest użycie segmentu tego typu.
  • wyrażenie jest liczbą rezerwowanych jednostek, każda o rozmiarze jednego bita. wyrażenie nie może zawierać odniesień w przód, symboli relokowalnych lub symboli zdefiniowanych poza bieżącym plikiem źródłowym.

Dyrektywa DBIT rezerwuje przestrzeń w segmencie adresowanym bitowo rozpoczynając od bieżącego adresu reprezentowanego przez licznik położenia tego segmentu. Następnie licznik położenia jest zwiększany o wartość wynikająca z obliczonego wyrażenia. Obszar pamięci umożliwiający adresowanie bitowe jest ograniczony, dlatego suma licznika położenia oraz wartości wyrażenia nie może przekroczyć rozmiaru tego obszaru. Jeśli jednak wystąpi taka sytuacja, to jest to sygnalizowane komunikatem błędu asemblacji.

Bardzo często dyrektywa DBIT występuje w połączeniu z dyrektywą BSEG AT adres, co pokazano przy jej omawianiu, a powtórzono poniżej.

          BSEG AT 20h
UP_FLAG:  DBIT  1  ;rezerwuje fragment pamięci o rozmiarze 1 bita..
                   ;..zajmując komórkę pamięci o adresie 20h
DN_FLAG:  DBIT  2  ;rezerwuje fragment pamięci o rozmiarze 2 bitów..
                   ;..zajmując komórki pamięci o adresach 21h i 22h
Uwaga Asemblery analizują kod źródłowy co najmniej dwukrotnie. W pierwszym przejściu, zbierane są wszystkie symbole oraz określana jest długość każdej instrukcji. W drugim przejściu, obliczane są wyrażenia z doniesieniami w tył oraz tworzony jest kod obiektów. Z tego powodu wyrażenia używane w dyrektywie DBIT nie mogą zawierać odniesień w tył.

DS

Implementacja: ASEM-51, Keil

Dyrektywa DS rezerwuje określoną liczbę bajtów w przestrzeni pamięci danych. Jej format ma następującą postać:

etykieta:  DS  wyrażenie
  • etykieta jest symbolem, który określa adres rezerwowanej pamięci. Pobiera ona bieżącą wartość adresu i klasę pamięci aktywnego segmentu. Etykieta może być użyta tam, gdzie użycie adresu z segmentu tego typu jest dopuszczalne.
  • wyrażenie jest liczbą rezerwowanych jednostek, każda o rozmiarze jednego bajta. Wyrażenie nie może zawierać odniesień w przód, symboli relokowalnych lub symboli zdefiniowanych poza bieżącym plikiem źródłowym.

Dyrektywa DS rezerwuje przestrzeń w bieżącym segmencie rozpoczynając od bieżącego adresu. Różnicą w stosunku do dyrektywy DBIT jest tylko podstawowa jednostka rezerwacji, którą dla tej dyrektywy jest bajt. Tutaj również suma licznika położenia i wartości wyrażenia nie może przekroczyć granicznego rozmiaru dostępnej przestrzeni adresowej w danym segmencie.

Również ta dyrektywa występuje często z dyrektywami dotyczącymi deklaracji segmentów absolutnych lub relokowalnych.

        DSEG AT 30h
WYNIK:  DS 4     ;rezerwacja 4 bajtów od adresu 30h w wewnętrznej pamięci..
                 ;..danych adresowanej bezpośrednio
LICZBA: DS 2     ;rezerwacja kolejnych 2 bajtów od adresu 34h
        DS 20    ;rezerwacja kolejnych 20 bajtów od adresu 36h
        
        XDATA AT 2000h
TIME:   DS 8     ;rezerwacja 8 bajtów od adresu 2000h w zewnętrznej..
                 ;..pamięci danych

W przypadku przykładu związanego z segmentem DSEG, od adresu określonego etykietą WYNIK zostaną zarezerwowane 4 bajty pamięci, a od adresu określonego etykietą LICZBA kolejne 2 bajty. Etykieta WYNIK jest właściwie tożsama z adresem 30H, gdyż wskazuje na pierwszą rezerwację tuż za dyrektywą DSEG określającą adres na wartość 30H. Z kolei etykieta LICZBA jest tożsama z adresem 34H. Zatem można jej używać w rozkazach, w których dopuszczalne jest podanie jako jednego z operandów adresu w wewnętrznej pamięci danych. Poniżej podno kilka przykładów.

MOV A,LICZBA     ;zapis do akumulatora wartości z komórki pamięci..
                 ;..wskazywanej etykietą LICZBA, czyli komórki o adresie 30h
                 ;Rozkaz ten jest równoważny następującemu rozkazowi: MOV A,30H
MOV R1,LICZBA+1  ;zapis do rejestru R1 wartości z komórki pamięci..
                 ;..o adresie o 1 większym niż komórka wskazywana..
                 ;..przez etykietę LICZBA. Rozkaz ten jest równoważny..
                 ;..następującemu rozkazowi: MOV R1,31H