no MACRO yes Wstępdo assemblera MA51 c.d. makrodefinicje Ryszard J. Barczyński, 2017 Politechnika Gdańska, Wydział FTiMS, Katedra Fizyki Ciała Stałego Materiały dydaktyczne do użytku wewnętrznego
Assembler Assembler to język programowania charakteryzujący się tym, że... jedna instrukcja assemblera jest tłumaczona na jeden rozkaz procesora... możliwy jest bezpośredni dostęp do wszystkich zasobów systemu... praktycznie każda architektura procesora posiada własny assembler Assemblery zwykle pracują we współpracy z linkerami, bibliotekarzami itp. Assemblery często posiadają wbudowane generatory makrodefinicji
składnia macro_name MACRO par1, par2,... park {linie instrukcji} Makrodefinicja umożliwia przypisanie nazwy grupie instrukcji Tak zdefiniowanej nazwy można używać w programie jak zwykłej instrukcji Jej użycie powoduje każdorazowo wstawienie zdefiniowanej zawartości
przykład definicji SAVE MACRO ; Makrodefinicja ; zachowuje ; na stosie ; kilka rejestrów PUSH ACC PUSH B PUSH PSW PUSH DPH PUSH DPL przykład drugiej definicji RESTORE MACRO ; Makrodefinicja ; odtwarza ze stosu ; rejestry zachowane ; przez makro SAVE POP DPL POP DPH POP PSW POP B POP ACC
przykład definicji Exchange MACRO p1, p2 ; Makrodefinicja ; zamienia ; zawartości ; dwóch komórek ; pamięci PUSH p1 PUSH p2 POP p1 POP p2 przykład użycia [...] DSEG Dana1: DS 1 Dana2: DS 1 CSEG [...] Exchange Dana1, Dana2 [...]
przykład definicji ZapalLED MACRO CLR P1.3 ZgasLED MACRO SETB P1.3 przykład użycia [...] JB FlagaLED, Lab01 ZgasLED JMP Lab02 Lab01: ZapalLED Lab02: [...]
Możliwe jest rekursyjne stosowanie makrodefinicji Assembler MA51 dopuszcza 32 poziomy rekursji W makrodefinicjach można używać symboli lokalnych Do ich definicji służy dyrektywa LOCAL W MA51 można zdefiniować do 16 symboli lokalnych Mogą to być etykiety oraz deklaracje danych
dyrektywa LOCAL składnia macro_name MACRO par1,par2,..park LOCAL symb [,symb] {linie instrukcji} Symbole oznaczone jako lokalne są dostępne tylko wewnątrz makrodefinicji Przy rozwinięciu makrodefinicji tworzone są dla nich unikalne nazwy
dyrektywa LOCAL przykład delay MACRO par1 LOCAL del0 P7,#par1 del0: DJNZ P7,del0 użycie P1,#0 delay 3 P1,#1 delay 5 wygeneruje kod Uni1: DJNZ Uni2: DJNZ P1,#0 P7,#3 P7,Uni1 P1,#1 P7,#5 P7,Uni2
Dyrektywy powtórzeń bloków Odmianami makrodefinicji są dyrektywy powtórzeń Umożliwiają one wielokrotne powtórzenia bloku tekstu Powtórzenia mogą być zagnieżdżone Dyrektywy te to REPT, WHILE, IRP, IRC
dyrektywa REPT składnia REPT liczba_powtórzeń {linie instrukcji} Wnętrze makrodefinicji zostanie powtórzone liczba_powtórzeń razy
dyrektywa REPT przykład shortdel MACRO REPT 3 NOP ; koniec bloku powtórzeń ; koniec makrodefinicji w wyniku użycia shortdel otrzymamy kod NOP NOP NOP
dyrektywa IRP składnia IRP par,<arg [,arg]> {linie instrukcji} Wnętrze makrodefinicji zostanie powtórzone dla każdego argumentu z listy Liczba powtórzeń jest równe liczbie argumentów
dyrektywa IRP przykład pulse MACRO port IRP element,<#0aah, #055h, #0AA> port,element ; koniec bloku powtórzeń ; koniec makrodefinicji w wyniku użycia pulse P1 otrzymamy kod P1,#0AAh P1,#055h P1,#0AAh
dyrektywa IRC składnia IRC par,<łańcuch_tekstowy> {linie instrukcji} Wnętrze makrodefinicji zostanie powtórzone dla znaku łańcucha tekstowego Liczba powtórzeń jest równa liczbie znaków łańcucha
dyrektywa IRC przykład printend MACRO IRC znak,<end> A,#'znak' CALL PrintZnak ; koniec bloku w wyniku użycia printend otrzymamy kod CALL CALL CALL A,#'E' PrintZnak A,#'N' PrintZnak A,#'D' PrintZnak
operator NUL przykład ZerujBit MACRO par IF NUL par P0,#0 ; bez parametru zeruj cały port ELSEIF CLR P0.par ; a z parametrem pojedynczy bit ENDIF Operator NUL umożliwia sprawdzenie czy parametr nie jest pusty
operator % przykład Dana EQU 10 MojeA MACRO par A,par wywołanie MojeA Dana wygeneruje A,Dana a wywołanie MojeA %Dana wygeneruje A,10 Operator % oblicza wartość numeryczną parametru przed jego przekazaniem
uwagi końcowe Makrodefinicje mogą znacznie skrócić program Makrodefinicje mogą uczynić program czytelniejszym... mogą też uczynić go zupełnie nieczytelnym Wielu programistów zupełnie nie używa makrodefinicji... nie ma obowiązku Nigdy, przenigdy nie myl makrodefinicji z podprogramami