[ Pobierz całość w formacie PDF ]

wszystkie pliki doÅ‚Ä…czone do poprzedniego poziomu makra sÄ… zamykane na tym poziomie, i ekspansja makra na
tym poziomie jest natychmiast przerywana.
III.11.7WywoÅ‚ania zagnieżdżonych i powtarzanych makr.
CiaÅ‚a makr mogÄ… również zawierać wywoÅ‚ania makr, i ciaÅ‚a tych wywoÅ‚ywanych makr mogÄ… zawierać 
wywoÅ‚ania makr, itd.
JeÅ›li wywoÅ‚anie makra jest widziane poza ekspansjÄ… makra, kompilator natychmiast rozpoczyna pracÄ™ z 
ekspansjÄ… tego makra. W tym celu linie ciaÅ‚a po ekspansji sÄ… wstawiane w miejsce wywoÅ‚ania makra w ciele 
makra zawierajÄ…cego to makro, i tak dzieje siÄ™ tak dÅ‚ugo, aż makro caÅ‚kowicie podlegnie ekspansji. Wtedy 
ekspansja makra wywoÅ‚ujÄ…cego kontynuowana jest z ciaÅ‚em makra zagnieżdżonego, które jest wewnÄ…trz tego 
makra.
PrzykÅ‚ad 1: INSIDE MACRO
SUBB A,R3
ENDM
OUTSIDE MACRO
MOV A,#42
INSIDE
MOV R7,A
ENDM
WewnÄ…trz ciaÅ‚a makra OUTSIDE, wywoÅ‚ywane jest makro INSIDE. JeÅ›li OUTSIDE 
jest wywoÅ‚ane (i tryb listingu jest ustawiony na $GENONLY), otrzymujemy coÅ› 
takiego:
Line I Addr Code Source
15+ 1 0000 74 2A MOV A,#42
17+ 2 0002 9B SUBB A,R3
18+ 1 0003 FF MOV R7,A
Od czasu, gdy wywoÅ‚ania makr mogÄ… być zagnieżdżane do dowolnej gÅ‚Ä™bokoÅ›ci (do czasu, gdy dysponujemy 
wolnÄ… pamięć), poziom ekspansji makra jest pokazany w kolumnie I pliku listingu.
Od czasu, gdy makra i pliki doÅ‚Ä…czane mogÄ… być zagnieżdżane w sekwencjach arbitralnych na dowolnej 
gÅ‚Ä™bokoÅ›ci, poziom zagnieżdżania jest liczony przez wszystkie poziomy makr i plików. Dla lepszej 
przejrzystoÅ›ci, znak znajdujÄ…cy siÄ™ za globalnym numerem linii to  : dla plików dowiÄ…zanych oraz  + dla makr.
JeÅ›li makra wywoÅ‚ujÄ… siebie same, zwie siÄ™ je makrami rekurencyjnymi. W takim przypadku muszÄ… wystÄ™pować 
kryteria zatrzymania, by uniknąć ciÄ…gÅ‚ego wywoÅ‚ywania makra przez siebie do czasu, gdy kompilator zgÅ‚osi 
brak pamiÄ™ci! Tu wyjÅ›ciem jest kolejny raz kompilacja warunkowa:
PrzykÅ‚ad 2: Makro COUNTDOWN definiuje staÅ‚Ä… 16­bitowÄ… od 1 do n w pamiÄ™ci ROM. n może być 
przekazane do makra jako parametr:
COUNTDOWN MACRO DEPTH
IF DEPTH GT 0
DW DEPTH
COUNTDOWN %DEPTH­1
ENDIF
ENDM
JeÅ›li COUNTDOWN jest wywoÅ‚ywany tak
COUNTDOWN 7
wynik jest nastÄ™pujÄ…cy (w trybie listingu $GENONLY/$CONDONLY):
Line I Addr Code Source
16+ 1 0000 00 07 DW 7
19+ 2 0002 00 06 DW 6
22+ 3 0004 00 05 DW 5
25+ 4 0006 00 04 DW 4
28+ 5 0008 00 03 DW 3
31+ 6 000A 00 02 DW 2
34+ 7 000C 00 01 DW 1
Po ciemnych wiekach , gdy osiadÅ‚ kurz i sÅ‚oÅ„ce przebiÅ‚o siÄ™ przez mrok, nauka komputerowa odkryÅ‚a metodÄ™ 
programowania rekurencyjnego. Nie byÅ‚o wÄ…tpliwoÅ›ci, Å¼e to wyÅ‚o ROZWIZANIE!
Wtedy naukowcy komputerowi zaczÄ™li wyjaÅ›niać to studentom. Ale wydawaÅ‚o siÄ™, Å¼e studenci nie rozumieli 
tego. Zawsze wyjaÅ›niali, Å¼e obliczanie rekurencyjne n! jest gÅ‚upim przykÅ‚adem. Wszyscy naukowcy poczuli, Å¼e 
wciąż im czegoÅ› brakowaÅ‚o. Po kolejnych 10 latach trudnych poszukiwaÅ„, znalezli również PROBLEM:
PrzykÅ‚ad 3: Wieże Hanoi
SÄ… trzy pionowe kijki na stole. Na kijku 1 jest n dysków o różnej Å›rednicy z otworem w 
Å›rodku, najmniejszy dysk na górze, najwiÄ™kszy na dole.
 Patyk nr1 Patyk nr 2 Patyk nr 3
| | |
Dysk 1 ==|== | |
Dysk 2 ===|=== | |
Dysk n ====|==== | |
| | |
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Problem polega na przeniesieniu wieży dysków z kijka nr 1 na kijek nr 2 przy pomocy najmniejszej 
liczby ruchów. Tylko najwyżej poÅ‚ożony dysk może być ruszony za jednym razem i Å¼aden dysk nie 
może leżeć na mniejszym dysku. Kijek trzeci może zostać użyty jako poczÄ…tkowy. To jest 
ROZWIZANIE z użyciem makr w ASEM­51:
;Wieże Hanoi
$GENONLY CONDONLY
DISCS EQU 3 ;ilość dysków
HANOI MACRO n, SOURCE, DESTINATION, SCRATCH
IF n > 0
 HANOI %(n­1), SOURCE, SCRATCH, DESTINATOR
 ;rusz najwyżej poÅ‚ożony dysk z kijka &SOURCE na kijek &DESTINATION
 HANOI %(n­1), SCRATCH, DESTINATION, SOURCE
ENDIF
 ENDM
HANOI DISCS, 1, 2, 3
END
Makro rekurencyjne HANOI generuje instrukcjÄ™ dla PROBLEMU, gdzie instrukcje pojawiajÄ… siÄ™ jako 
linie komentarza w liniach pliku listingu. Symbol DISCS musi być ustawiony do Å¼Ä…danej liczby 
dysków. JeÅ›li HANOI jest wywoÅ‚ane nastÄ™pujÄ…co:
HANOI 3, 1, 2, 3
nastÄ™pujÄ…ca  instrukcja  jest generowana:
27+ 3 ; rusz najwyżej poÅ‚ożony dysk z kijka 1 na kijek 2
35+ 2 ; rusz najwyżej poÅ‚ożony dysk z kijka 1 na kijek 3
44+ 3 ; rusz najwyżej poÅ‚ożony dysk z kijka 2 na kijek 3
53+ 1 ; rusz najwyżej poÅ‚ożony dysk z kijka 1 na kijek 2
64+ 3 ; rusz najwyżej poÅ‚ożony dysk z kijka 3 na kijek 1
72+ 2 ; rusz najwyżej poÅ‚ożony dysk z kijka 3 na kijek 2
81+ 3 ; rusz najwyżej poÅ‚ożony dysk z kijka 1 na kijek 2
Kontrolki GENONLY i CONDONLY zapewniajÄ…, Å¼e tabela nie bÄ™dzie zawierać caÅ‚ego wywoÅ‚ania 
makra i konstrukcji IF.
wiczenie 1:
Zmodyfikuj makro HANOI tak, by generowaÅ‚o tabelÄ™ ruchów w pamiÄ™ci ROM, co mogÅ‚o by być 
używane jako wejÅ›cie dla ramienia robota kontrolowanego przez 8051, które rzeczywiÅ›cie gra w grÄ™
z 3 rzeczywistymi kijkami i realnymi n dyskami.
wiczenie 2: n
Udowodnij, Å¼e minimalna ilość ruchów to 2 ­ 1. ;­)
III.11.8Definicje makr zagnieżdżonych
CiaÅ‚a makra mogÄ… także zawierać dalsze makrodefinicje. Jednakże takie zagnieżdżone makrodefinicje nie sÄ… 
prawidÅ‚owe dopóki makro, które je zawiera nie ulegnie ekspansji. Oznacza to, Å¼e makro musi zostać wywoÅ‚ane 
zanim możliwe bÄ™dzie wywoÅ‚anie zagnieżdżonego makra.
PrzykÅ‚ad 1: Makro, które może zostać użyte do definiowania makr z nazwami arbitralnymi, może 
wyglÄ…dać w nastÄ™pujÄ…cy sposób:
DEFINE MACRO MACNAME
MACNAME MACRO
DB 'I am the macro &MACNAME.'
ENDM
ENDM
By nie przeÅ‚adować przykÅ‚adu przez  jak to siÄ™ robi , :­)
makro zagnieżdżone przedstawia siÄ™ tylko delikatnie
z pomocÄ… odpowiedniego znaku w pamiÄ™ci ROM. WywoÅ‚anie
DEFINE Obiwan
zdefiniuje makro
Obiwan MACRO
DB 'I am the macro Obiwan.'
ENDM
a wywoÅ‚anie
DEFINE Skywalker
zdefiniuje makro:
Skywalker MACRO
DB 'I am the macro Skywalker.'
ENDM
PrzykÅ‚ad 2: Poniższe makro ma wstawiać w od zmiennÄ… ilość instrukcji NOP. W tym celu makro z 
zagnieżdżonymi blokami REPT wydaje siÄ™ najlepszym rozwiÄ…zaniem:
REPEAT MACRO NOPS
REPT NOPS
NOP
ENDM
ENDM
Wywołanie
REPEAT 4
w rezultacie stworzy coÅ› takiego:
Line I Addr Code Source
9+ 1 N 0004 REPT 4
10+ 1 NOP
11+ 1 ENDM
12+ 2 0000 00 NOP
13+ 2 0001 00 NOP
14+ 2 0002 00 NOP
15+ 2 0003 00 NOP
III.11.9Reprezentacja w pliku "List File"
Czasami ekspansja makra ma tendencjÄ™ do generowania o wiele wiÄ™cej linii listingu niż kodu. Listować czy nie 
listować­ oto jest pytanie! Wymagania by osiÄ…gnąć lepszy poglÄ…d na caÅ‚ość lub mieć wiÄ™cej detali mogÄ… być 
różne w różnych fazach tworzenia programu lub w innych sekcjach programu. By zawsze mieć najlepsze 
rezultaty, kilka generalnych kontrolek zostaÅ‚o wprowadzonych, które oddziaÅ‚ujÄ… na reprezentacjÄ™ ekspansji 
makra oraz konstrukcji IFxx w pliku listingu (zobacz rozdziaÅ‚  III.8 Kontrolki Asemblera ):
Kontrolka Typ Domyślna Skrót Znaczenie
$GEN G $GEN $GE listowanie wywoÅ‚aÅ„ makr i linii ekspansji
$NOGEN G $NOGE listowanie tylko wywoÅ‚aÅ„ makr
$GENONLY G $GO listowanie tylko linii ekspansji
$COND G $COND ­­­ listowanie peÅ‚nej konstrukcji IFxx.. ENDIF
$NOCOND G ­­­ nie listuj linii dla nieprawdziwych warunków
$CONDONLY G ­­­ listuj tylko linie kompilowane [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • girl1.opx.pl
  •