[ Pobierz całość w formacie PDF ]
Przykład 1: Poniższe proste makro ma na celu odczytać znak z portu UART 8051 i zapisać go w A:
RECEIVE MACRO
UARTIN: JNB RI, UARTIN
MOV A, SBUF
CLR RI
ENDM
To zostanie wykonane tylko raz! Jeśli makro RECEIVE zostanie wywołane
Kilkakrotnie, etykieta UARTIN będzie definiowana kilkakrotnie.
Można to rozwiązać po prostu deklarując lokalny symbol UARTIN.
W tym celu wyrażenie LOCAL zostało przedstawione. Po słowie kluczowym LOCAL, lista lokalnych symboli
może zostać wyspecyfikowana, a symbole te należy rozdzielić przecinkami. Symbole te będą obowiązywać
tylko wewnątrz makra, które zawiera wyrażenie LOCAL. LOCAL może być wstawione bezpośrednio po słowie
MACRO lub REPT i musi poprzedzać pierwszą linię ciała makra. Mogą zawierać dowolną liczbę symboli
lokalnych. Ciało makra może być poprzedzone przez lokalne wyrażenia arbitralne.
Lokalne symbole muszą być prawidłowymi symbolami, unikalnymi wewnątrz makra i z nazwami różnymi od
formalnych parametrów (jeśli jakieś są). Słowa kluczowe nie mogą być używane jako lokalne nazwy. Jeśli
lokalny symbol posiada taką samą nazwę, jak symbol globalny, lokalny zakres ma pierwszeństwo przed
zastępstwem.
Kiedy makro jest rozszerzone, lokalne symbole są zawsze zastępowane: formalne parametry są zastępowane
przez argumenty makra, i lokalne symbole, które zostały zadeklarowane w wyrażeniu LOCAL, są zastępowane
przez unikalne, globalne nazwy, które kompilator generuje podczas każdej ekspansji. Mają one zawsze format ??
xxxx, gdzie xxxx jest unikalnym numerem symbolu.
Przykład 2: Po przeprojektowaniu naszego poprzedniego makra RECEIVE przy użyciu lokalnych symboli,
wygląda ono następująco:
RECEIVE MACRO
LOCAL UARTIN
UARTIN: JNB RI,UARTIN
MOV A,SBUF
CLR RI
ENDM
Zaawansowane w sposób przedstawiony powyżej makro będzie działać prawidłowo,
Tak często, jak to wymagane. Gdy wywoływane jest RECEIVE po raz pierwszy,
Symbol lokalny UARTIN zostanie zastÄ…piony przez ??0000,
??0000: JNB RI,??0000
MOV A,SBUF
CLR RI
Gdy jest wywołane drugi raz, UARTIN zostanie zastąpione przez ??0001, itd.:
??0001: JNB RI,??0001
MOV A,SBUF
CLR RI
Jednakże, wskazane jest, by nie definiować globalnych symboli w formacie ??xxxx, by uniknąć konfliktów z
Zastępowaniem lokalnych symboli przez makra.
III.11.5Operatory Makr
Istnieje kilka specjalnych znaków kontrolnych, które są bardzo użyteczne w definicjach makr, wywołaniach i
wyrażeniach:
;; Komentarz makr:
Normalnie, komentarze w liniach ciała są również zawarte w liniach rozszerzenia. Jeśli
komentarz zaczyna siÄ™ od ;; , nie jest zachowywany podczas definiowania makra. Przez to
komentarz nie zajmuje przestrzeni pamięci i pojawia się tylko w pliku listingu w definicji
makra, ale nie ma go w rozszerzonych liniach..
! Operator dosłowny:
Jeśli znak escape ! poprzedza inny drukowalny znak w argumencie makra, kompilator jest
zmuszony do traktowania znaku dosłownie. Oznacza to, że zostanie przekazany do makra,
nawet jeśli jest to znak kontrolny, podczas gdy sam operator dosłowny jest usuwany.
Nawiasy dosłowne:
Jeśli argument makra ma zawierać znaki kontrolne lub znaki separacji, musi on być zamknięty
w nawiasy dosłowne , by przekazać je do makra jako jeden argument łańcuchowy,
podczas gdy nawiasy są kasowane. Nawiasy dosłowne mogą być zagnieżdżane na dowolną
głębokość.
% Ocenianie:
Jeśli argument makra jest poprzedzony przez operator oceny % , jest on interpretowany jako
równanie, które zostanie wykonane przed przekazaniem go do makra. Aktualny łańcuch
argumentu nie będzie wyrażeniem, ale dziesiętną reprezentacją ASCII jego wartości.
Wyrażenie musi by znane podczas pierwszego przejścia.
& Zastępowanie:
Znak & oddziela nazwy parametrów (symboli lokalnych) od otaczającego je tekstu. Na
zewnątrz łańcuchów w cudzysłowach oraz komentarzy, służy on tylko jako ogólny znak
rozdzielający. Stosuje się to zawsze, gdy symbol lokalny bezpośrednio poprzedza lub
występuje po kolejny łańcuch alfanumeryczny. Wewnątrz łańcucha w cudzysłowach oraz
komentarzy symbol lokalny musi poprzedzać znak & , jeśli ma on zostać tam zastąpiony.
Podczas ekspansji każdego makra, kompilator usuwa dokładnie jeden znak & z każdej
[ Pobierz całość w formacie PDF ]