|
|
[ Pobierz całość w formacie PDF ]
Przykład: DBIT 16 NAME definiuje nazwę modułu Definiuje nazwę modułu dla pliku OMF51. Jeśli nie zdefiniowano nazwy modułu, nazwa modułu jest pobierana z nazwy pliku zródłowego. Kiedy generowany jest plik w formacie IntelHEX, instrukcja NAME nie jest brana pod uwagę. Nazwa modułu musi być prawidłowym symbolem asemblera. Tylko jedna nazwa instrukcji jest dozwolona w programie. Symbol może być jednak redefiniowany w poszczególnych programach. Przykład: NAME My_1st_Program ORG początek lokacji segmentu Wyrażenie ustawia licznik lokacji w aktualnym segmencie do wartości . Wartość musi być znana w pierwszym przejściu i musi być większa lub równa wartości początkowej segmentu. Domyślna wartość liczników wszystkich segmentów na początku programu wynosi 0. Przykład: ORG 08000H USING definiuje, który bank rejestrów ma być używany Wyrażenie ustawia używany bank rejestrów na , gdzie wartość może wynosić od 0 do 3. Instrukcja USING ma wpływ na symbole specjalne asemblera AR0, ..., AR7, które reprezentują bezpośredni adres rejestrów R0, ..., R7 w aktualnym banku rejestrów. Wartość musi być znana przy pierwszym przejściu! Domyślną wartością dla USING jest 0. Przykład: USING 1 END koniec programu To musi być ostatnie wyrażenie w pliku zródłowym. Po wyrażeniu END dozwolone są tylko komentarze i puste linie! Przykład: END ;koniec programu EQU definiuje stałą numeryczną EQU definiuje rejestr SET definiuje zmienną numeryczną SET definiuje zmienną w rejestrze Instrukcja EQU definiuje symbol dla stałej numerycznej lub dla rejestru. Jeśli wyrażenie numeryczne jest przypisane do symbolu, będzie on typu numerycznego. Jeśli rejestr jest przypisany do symbolu, będzie on typu rejestrowego. może być jednym ze specjalnych symboli asemblera: A, R0, R1, R2, R3, R4, R5, R6 lub R7. Symbol raz zdefiniowany przy użyciu EQU nie może być zmieniany! Instrukcja SET pracuje podobnie do EQU, jednakże symbole zdefiniowane przy użuciu SET mogą być redefiniowane przy użyciu instrukcji SET. Wartość i musi być znana przy pierwszym przejściu! Symbol zdefiniowany przy użyciu SET nie może być redefiniowany przy użyciu EQU! Symbol zdefiniowany przy użyciu EQU nie może być redefiniowany przy użyciu SET! Przy przejściu drugim, referencje do symboli zdefiniowanych przy użyciu SET są zamieniane na ostatnią wartość symbolu, która była definiowana przy przejściu pierwszym. Symbol rejestru może być używany jako operand w całym programie zamiast adresu rejestru. Dalsze odwołanie symboli do rejestrów jest zabronione! Przykłady: MAXMONTH EQU 12 OCTOBER EQU MAXMONTH2 COUNTREG EQU R5 CHAPTER SET 1 CHAPTER SET CHAPTER+1 CHAPTER SET A CODE definiuje adres ROM DATA definiuje adres bezpośredni RAM IDATA definiuje pośredni adres RAM BIT definiuje adres w przestrzeni bitowej XDATA definiuje adres w zewnętrznej pamięci RAM Powyższe instrukcje definiują symboliczne adresy dla pięciu segmentów pamięci (przestrzeni adresowych) mikrokontrolera 8051. Dla DATA, IDATA oraz BIT, wartość nie może przekroczyć FFH! Wartość parametru musi być znana przy pierwszym przejściu. Raz zdefiniowany symbol przy pomocy powyższych instrukcji nie może być ponownie definiowany. Przykłady: EPROM CODE 08000H STACK DATA 7 V24BUF IDATA 080H REDLED BIT P1.5 SAMPLER XDATA 0100H CSEG [AT ] przechodzi do segmentu CODE [do adresu] DSEG [AT ] przechodzi do segmentu DATA [do adresu] ISEG [AT ] przechodzi do segmentu IDATA [do adresu] BSEG [AT ] przechodzi do segmentu BIT [do adresu] XSEG [AT Powyższe instrukcje powodują przejście do jednej z pięciu przestrzeni adresowych mikrokontrolera 8051. Jeśli adres bazowy segmentu jest wyspecyfikowany przy użyciu AT , nowy segment o adresie absolutnym jest rozpoczynany i licznik lokacji przestrzeni jest ustawiany do wartości . Jeśli wyrażenie AT jest pomijane, licznik lokacji zachowuje poprzednią wartość poszczególnych segmentów. Wartość musi być znana przy pierwszym przejściu kompilatora. Na początku programu, domyślnym segmentem jest segment CODE, a adresy wszystkich segmentów równe są zero. Przykłady: DSEG ;przełączenie do segmentu DATA CSEG AT 8000h ;nowy segment CODE o adresie 8000h XSEG AT 0 ;nowy segment XDATA o adresie początkowym 0 III.7Typy segmentów Każde kompilowane wyrażenie jest przypisane do segmentu zależnego od jego operandów i operatorów. Typ segmentu wskazuje przestrzeń adresową, do której wynik może należeć, jeśli był użyty jako adres. Występuje sześć możliwych typów segmentów: CODE DATA IDATA XDATA BIT NUMBER (bez typu) Większość wyników wyrażeń ma tym NUMBER. Oznacza to, że nie posiadają one typu. Jednakże w niektórych przypadkach może być przydatne przypisanie mu typu segmentu. Poniższe sześć zasad jest stosowanych, gdy oceniany jest typ segmentu: 1. Stałe liczbowe zawsze są bez typu. W konsekwencji, ich segment jest typu NUMBER. 2. Symbole są przypisywane do typu segmentu podczas ich definiowania. Symbole, które są definiowane przy użyciu EQU lub SET nie posiadają typu segmentu. 3. Wyniki ogólnych operacji (+, , NOT, HIGH, LOW) przyjmą typ segmentu operandów. 4. Wyniki operacji binarnych (poza + , oraz . ) nie będą posiadały typu segmentu. 5. Jeśli tylko jeden operand w operacji binarnego + lub posiada typ segmentu, wynik będzie posiadał ten sam typ segmentu. We wszystkich pozostałych przypadkach, wynik nie będzie posiadał typu segmentu. 6. Wynik operacji bitowej . będzie zawsze posiadał typ segmentu BIT. Przykłady: Poniższe symbole zostały zdefiniowane w programie: OFFSET EQU 16 START CODE 30H DOIT CODE 0100H REDLED BIT P1.3 VARIAB4 DATA 20H PORT DATA 0C8H RELAY EQU 5 1.) Wyrażenie START+OFFSET+3 będzie miało typ segmentu CODE 2.) Wyrażenie START+DOIT nie będzie miało typu segmentu 3.) Wyrażenie DOITREDLED nie będzie miało typu segmentu 4.) Wyrażenie 2*VARIAB4 nie będzie miało typu segmentu 5.) Wyrażenie PORT.RELAY będzie miało typ segmentu BIT Typ segmentu jest sprawdzany, gdy wyrażenia pojawiają się jako adresy. Jeśli wyniki wyrażenia nie jest beztypowy i nie posiada typu segmentu, instrukcja jest oflagowana komunikatem błędu. Jedynymi wyjątkami są segmenty DATA oraz IDATA, które wychodząc z założenia są kompatybilne w przestrzeni adresowej od 0 do 7FH. Od czasu, kiedy ASEM51 posiada wsparcie tylko dla segmentów absolutnych, adresy te zawsze wskazują na te same fizyczne miejsca w wewnętrznej pamięci. Przykład: Line I Addr Code Source 1: N 30 DSEG AT 030H ;wewnętrzna pamięć RAM 2: 30 N 01 COUNT: DS 1 ;zmienna licznika 3: 4: CSEG ;ROM 5: 0000 C2 30 START: CLR COUNT ^ @@@@@ segment type mismatch @@@@@ Instrukcja CLR jest oflagowana komunikatem błędu segment type mismatch . Jednakże COUNT jest etykietą z segmentem DATA! III.8Kontrolki Asemblera ASEM51 ma zaimplementowane kontrolki, które przyspieszają proces kompilacji i generowania pliku listingu. Występują dwie grupy kontrolek: podstawowe i ogólne. Podstawowe kontrolki mogą być tylko używane tylko na początku programu i mają wpływ na proces kompilacji. Mogą być poprzedzane przez wyrażenia kontrolne, linie puste i linie komentarzy. Jeśli te same kontrolki podstawowe są użyte kilkukrotnie z różnymi parametrami, ostatnie wystąpienie kontrolki się liczy.
[ Pobierz całość w formacie PDF ] zanotowane.pldoc.pisz.plpdf.pisz.plkwiatpolny.htw.pl
|
|
Cytat |
Dobre pomysły nie mają przeszłości, mają tylko przyszłość. Robert Mallet De minimis - o najmniejszych rzeczach. Dobroć jest ważniejsza niż mądrość, a uznanie tej prawdy to pierwszy krok do mądrości. Theodore Isaac Rubin Dobro to tylko to, co szlachetne, zło to tylko to, co haniebne. Dla człowieka nie tylko świat otaczający jest zagadką; jest on nią sam dla siebie. I z obu tajemnic bardziej dręczącą wydaje się ta druga. Antoni Kępiński (1918-1972)
|
|