MCS-51
Dyrektywy asemblerowe

Definiowanie symboli

Dyrektywy definiujące symbole umożliwiają tworzenie symboli, które mogą być używane do reprezentacji rejestrów, liczb i adresów. Symbole definiowane przez te dyrektywy nie mogą być wcześniej zdefiniowane i nie mogą być później redefiniowane. Wyjątkiem od tych reguł jest dyrektywa SET.

EQU, SET

Implementacja: ASEM-51, Keil

Dyrektywy EQU i SET przyporządkowują wartości numeryczne lub symbole rejestrów do wyspecyfikowanych nazw symbolicznych. Symbole zdefiniowane za pomocą dyrektywy EQU nie mogą być wcześniej zdefiniowane, a także nie mogą być później redefiniowane. Redefinicję symbolu umożliwia tylko dyrektywa SET. Instrukcje związane z tymi dyrektywami maja następujący format:

symbol  EQU  wyrażenie
symbol  EQU  rejestr
symbol  SET  wyrażenie
symbol  SET  rejestr
  • symbol jest definiowaną nazwą symboliczną. wyrażenie lub rejestr wyspecyfikowany w dyrektywach EQU lub SET będzie wstawiany przy każdym wystąpieniu tego symbolu w bieżącym programie asemblerowym.
  • wyrażenie jest wyrażeniem numerycznym, które nie zawiera odniesień w przód lub jest prostym wyrażeniem relokowalnym.
  • rejestr może być jedną z nazw rejestrów mikrokontrolera, np.: A, R0 lub SBUF.

Symbole zdefiniowane za pomocą dyrektywy EQU lub SET mogą być użyte w operandach, wyrażeniach lub adresach. Natomiast symbole, które są zdefiniowane na podstawie nazw rejestrów, mogą być użyte wszędzie tam, gdzie dopuszczalne jest użycie rejestrów.

Nie można użyć dyrektywy SET, jeśli symbol został wcześniej zdefiniowany za pomocą dyrektywy EQU i odwrotnie.

Poniżej przedstawiono kilka przykładów użycia dyrektyw EQU i SET. Jak można zauważyć, zdefiniowane wcześniej symbole mogą być później użyte do zdefiniowania innych symboli.

GRANICA   EQU   1200
ROZMIAR   EQU   GRANICA - 200 + 'A'
SERIAL    EQU   SBUF
ACCU      EQU   A
LICZNIK1  EQU   R5
WARTOSC   SET   100
WARTOSC   SET   WARTOSC / 2
LICZNIK2  SET   R1
TEMP      SET   LICZNIK2
TEMP      SET   WARTOSC * WARTOSC
Uwaga Nie należy definiować nowych symboli dla symboli specjalnych AR0 do AR7, gdyż adres rejestru Rn odpowiadający symbolowi ARn jest obliczany w momencie definiowania symbolu, a nie w miejscu jego użycia. Kiedy dyrektywa USING określa później właściwy bank rejestrów, wartość zdefiniowanego symbolu nie odpowiada adresowi reprezentowanemu aktualnie przez symbol ARn, a zatem generowany kod będzie prawdopodobnie niepoprawny.

CODE, BIT, DATA, IDATA, XDATA

Implementacja: ASEM-51, Keil

Dyrektywy CODE, BIT, DATA, IDATA oraz XDATA przyporządkowują danemu symbolowi adres w określonej klasie pamięci. Symbole zdefiniowane za pomocą tych dyrektyw nie mogą być zmieniane, jak również redefiniowane. Omawiane dyrektywy mają następujący format:

symbol  CODE   adres_code
symbol  BIT    adres_bit
symbol  DATA   adres_data
symbol  IDATA  adres_idata
symbol  XDATA  adres_xdata
  • symbol jest definiowaną nazwą symboliczną. Może być używany w każdym miejscu, gdzie wymagany jest adres w pamięci wyspecyfikowanego typu.
  • adres_code może być adresem w pamięci kodu z zakresu 0000H .. FFFFH.
  • adres_bit może być adresem bitu w wewnętrznej pamięci danych w przestrzeni o adresach z zakresu 20H .. 2FH adresowanej bitowo lub adresem bitu rejestru SFR adresowanego bitowo.
  • adres_data może być adresem rejestru SFR z zakresu adresów 80H .. FFH lub adresem w wewnętrznej pamięci danych z zakresu 0 .. 7FH.
  • adres_idata może być adresem w wewnętrznej pamięci danych adresowanej pośrednio z zakresu 00H .. FFH.
  • adres_xdata może być adresem w zewnętrznej pamięci danych z zakresu 0 .. FFFFH.

Poniżej przedstawiono kilka przykładów użycia omawianych dyrektyw.

          DSEG AT 21h        ;segment absolutny adresowany bitowo
CTRL:     DS     1           ;1-bajtowa zmienna (CTRL)

ALARM     BIT    CTRL.0      ;definicja symbolu dla najmłodszego..
                             ;..bitu w CTRL
LIGHT     BIT    ALARM+1     ;definicja symbolu dla kolejnego bitu w CTRL
LED       BIT    P1.1        ;definicja symbolu dla bitu 1 portu P1
DN_FLAG   BIT    24h.2       ;definicja symbolu reprezentującego bit..
                             ;..spod adresu 22h
EN_FLAG   BIT    60h         ;definicja symbolu reprezentującego bit..
                             ;..spod adresu 60h

RESET     CODE   00H
INTVEC_0  CODE   RESET + 03H
INTVEC_1  CODE   RESET + 0BH
INTVEC_2  CODE   RESET + 1BH

SERBUF    DATA   SBUF        ;redefinicja bufora SBUF
ARG1      DATA   40h
ARG2      DATA   ARG1 + 1
WYNIK     DATA   ARG1 + 2

BUFOR     IDATA  60H
BUF_LEN   EQU    20H
BUF_END   IDATA  BUFOR + BUF_LEN - 1

EXT_DATA  SEGMENT  XDATA
          RSEG     EXT_DATA
TIME:     DS     6           ;rezerwacja 6-bajtów w zewnętrznej..
                             ;..pamięci danych 
GODZ      XDATA  TIME + 0
MIN       XDATA  TIME + 2
SEC       XDATA  TIME + 4