176 6. Makrojęzyk asemblera MA SM
MOV SI,OFFSET ZRODLO
MOV DI,OFFSET PRZEZNACZENIE
MOV CX,DLUGOSC
REP MOVS ES:PRZEZNACZENIE,ZRODLO ASSUME ESiNOTHING POP ES ENDM
Przykładowe wywołanie makroinstrukcji
PRZEPISZ TAB TABLICA 1, TABLICA 2,100 Ą
spowoduje wygenerowanie sekwencji rozkazów i dyrektyw określonej definicją makroinstrukcji, przy czym parametr formalny ZRODLO zostanie zastąpiony parametrem aktualnym TABLICA l, a parametr PRZEZNACZENIE - parametrem TABLICA 2. Sto elementów tablicy będzie przepisanych.
Z makroinstrukcjami są związane pewne dodatkowe dyrektywy' oraz operatory ułatwiające korzystanie z makrojęzyka.
Dyrektywa PlIRGE
Dyrektywa PURGE kasuje definicję makroinstrukcji. Nazwa skasowanej makroinstrukcji może być wykorzystana do innych celów. Składnia dyrektywy ma postać
PURGE nazwa ł [, nazwa_2, ...J
przy czym nazwa _x oznacza nazwę kasowanej makroinstrukcji. ,)
Przykład
DWA MACRO REJESTR
DEC REJESTR DEC REJESTR ENDM
• • •
PURGE DWA
• • •
DWA DB 2 ♦
Dyrektywa EXITM Z r- V S ]<| MW W
Dyrektywa EXITM pozwala wcześniej zakończyć (przerwać) rozwinięcie makroinstrukcji. Dyrektywa ta nie może być stosowana wewnątrz konstrukcji IF-ELSE-ENDIF oraz wewnątrz makroinstrukcji zawartej w innej makroinstrukcji.
powered by
6.3. Dyrektywy i operatory dodatkowe
Przykład
MAKRO MACRO TEKST A, TEKST B
IFDIF < TEKST_A >, < TEKST B>
EX1TM
ENDIF
; rozwinięcie makroinstrukcji ; gdy oba łańcuchy są równe
ENDM ▲
Dyrektywa LOCAL
Dyrektywa LOCAL może występować jedynie wewnątrz definicji makroinstrukcji, w wierszu programu bezpośrednio po słowie kluczowym MACRO. Składnia dyrektywy jest następująca
LOCAL nazwa ł [, nazwa_2,...]
przy czym nazwa x to nazwa symboliczna, która mimo wielokrotnego wywoływania makroinstrukcji nie będzie przedefiniowana. Asembler przy pierwszym rozwinięciu makroinstrukcji zastąpi nazwę zadeklarowaną dyrektywą LOCAL napisem ??0000, przy drugim napisem ??0001 itd. aż do ??FFFF. Etykiety występujące w makroinstrukcji muszą zawsze być typu LOCAL.
Przykład
Definicja makroinstrukcji
A B MACRO A,B
LOCAL KONIEC CMP A,B
JE KONIEC ; są równe, nic nie rób !
DEC A ; nic są równe
INC B
KONIEC
ENDM
Wywołanie tak zdefiniowanej makroinstrukcji ma postać
A B AX,BX A B ZMIENNA,SI
Rozwinięcie obu kolejnych wywołań jest następujące
CMP AX,BX JE ??0000 DEC AX INC BX
CMP ZMIENNA,SI JE ??0001