Obszar lokalny
Głównym zadaniem obszaru lokalnego w MADS jest stworzenie nowej przestrzeni nazw dla etykiet.
Wszelkie etykiety zdefiniowane w obszarze lokalnym .LOCAL
są zasięgu lokalnego, można je też określić jako etykiety globalne zdefiniowane lokalnie o dostępie swobodnym, ponieważ można się do nich odwoływać co nie jest normalne w innych językach programowania.
Obszary lokalne są addytywne tzn. że może być wiele bloków .LOCAL
o tej samej nazwie, nie zostanie wygenerowany komunikat błędu Label ... declared twice.
Addytywność obszarów lokalnych odbywa się na aktualnym poziomie przestrzeni nazw, jeśli chcemy połączyć się z wybranym obszarem lokalnym w innej przestrzeni nazw, poprzedzamy pełną nazwę prowadzącą do takiego obszaru znakiem +
, np.:
.local lvl
tmp = 3
.endl
.local temp
tmp = 7
.local +lvl
.print tmp
.endl
.endl
Dla w/w przykładu zostanie wyświetlona wartość etykiety TMP
z obszaru lokalnego LVL
o wartości 3
. Gdyby zabrakło znaku +
w .LOCAL +LVL
wówczas wartość TMP
jaka zostanie wyświetlona to 7
.
W obszarze lokalnym .LOCAL
istnieje możliwość zdefiniowania etykiet o zasięgu globalnym (patrz rozdział Etykiety globalne).
Jeśli poszukiwana przez assembler etykieta nie wystąpiła w obszarze lokalnym .LOCAL
, wówczas MADS będzie poszukiwał ją w obszarze niższym aż dojdzie do obszaru globalnego. Aby odczytać natychmiastowo wartość etykiety globalnej z poziomu obszaru lokalnego .LOCAL
(czy też innego obszaru lokalnego) poprzedzamy nazwę etykiety znakiem dwukropka :
.
Obszarów lokalnych dotyczą n/w dyrektywy:
[name] .LOCAL [,address]
.LOCAL [name] [,address]
.ENDL [.LEND] [.END]
[name] .LOCAL [,address]
Deklaracja obszaru lokalnego o nazwie name
za pomocą dyrektywy .LOCAL
. Nazwa obszaru nie jest wymagana i nie jest konieczna. Do nazw obszarów lokalnych nie można używać nazw mnemoników i pseudo rozkazów. Jeśli nazwa jest zarezerwowana wystąpi błąd z komunikatem Reserved word.
Po nazwie obszaru lokalnego (lub po dyrektywie .LOCAL
) możemy podać nowy adres asemblacji bloku lokalnego. Po zakończeniu takiego bloku (.ENDL
) przywracany jest poprzedni adres asemblacji zwiększony o długość bloku lokalnego.
label .local,$4000
.endl
.local label2,$8000
.endl
.local
.endl
.local label3
.endl
Wszelkie definicje etykiet w obszarze .LOCAL
są typu lokalnego. Aby odwołać się do etykiety globalnej o tej samej nazwie co etykieta lokalna należy poprzedzić ją znakiem dwukropka :
, np.:
lab equ 1
.local
lab equ 2
lda #lab
ldx #:lab
.endl
W w/w przykładzie do rejestru A
zostanie załadowana wartość 2
, natomiast do rejestru X
wartość 1
.
Jeśli poszukiwana przez assembler etykieta nie wystąpiła w obszarze .LOCAL
, wówczas nastąpi jej szukanie w obszarze makra (jeśli jest aktualnie przetwarzane), potem w procedurze (jeśli procedura jest aktualnie przetwarzana), na końcu w głównym programie.
W zadeklarowanym obszarze lokalnym wszystkie definicje etykiet rozróżniane są na podstawie nazwy obszaru lokalnego. Aby dotrzeć do zdefiniowanej etykiety w obszarze lokalnym spoza obszaru lokalnego musimy znać nazwę obszaru i etykiety w nim występującej, np.:
lda #name.lab1
ldx #name.lab2
.local name
lab1 = 1
lab2 = 2
.endl
W adresowaniu takiej struktury .LOCAL
używamy znaku kropki .
.
Obszary lokalne możemy zagnieżdżać, możemy je umieszczać w ciele procedur zadeklarowanych przez dyrektywę .PROC
. Obszary lokalne są addytywne, tzn. może istnieć wiele obszarów lokalnych o tej samej nazwie, wszystkie symbole występujące w tych obszarach należeć będą do wspólnej przestrzeni nazw.
Długość wygenerowanego kodu w bloku .LOCAL
można sprawdzić przy pomocy dyrektywy .LEN
(.SIZEOF
).
.ENDL
Dyrektywa .ENDL
kończy deklarację obszaru lokalnego.
Przykład deklaracji obszaru lokalnego:
org $2000
tmp ldx #0 <------------- etykieta w obszarze globalnym
|
lda obszar.pole <--- | odwolanie do obszaru lokalnego
| |
.local obszar | | deklaracja obszaru lokalnego
| |
lda tmp <--- | |
| | |
lda :tmp | | <--- odwolanie do obszaru globalnego
| |
tmp nop <--- | definicja w obszarze lokalnym
|
pole lda #0 <--- <--- definicja w obszarze lokalnym
|
lda pole <----------------- odwolanie w obszarze lokalnym
.endl koniec deklaracji obszaru lokalnego