Asembler AVR
Budowa programu w asemblerze W ogólnym przypadku linia programu w asemblerze ma następującą budowę: <pole etykiety> <pole mnemonika> <pole argumentów> <pole komentarza> na przykład: tuskocz: add r1,r0 ;dodanie do r1 liczby z R0 mov r6,r1 ;odeslanie sumy do R6
gdzie: <pole etykiety> - obszar o szerokości min. 1 znaku, przeznaczony na wpisywanie identyfikatorów tzw. etykiet po etykiecie musi występować dwukropek, oddziela on wtedy etykietę od pozostałej zawartości linii i zwiększa czytelność programu; w polu tym wpisuje się także większość dyrektyw asemblera <pole mnemonika> - obszar przeznaczony na wpisanie symbolicznej nazwy rozkazu; w polu tym wpisuje się także niektóre dyrektywy asemblera (patrz dalej);
gdzie-c.d.: <pole argumentów> - obszar, którego wypełnienie jest opcjonalne - zależne od wymagań wpisanego w <polu mnemonika> rozkazu, pole to jest przeznaczone na listę argumentów rozkazu;
gdzie-c.d.: <pole komentarza> - opcjonalny obszar, którego początek jest identyfikowany przez znak średnika (‘;’) lub parę ‘//’; jest on przeznaczony do wpisywania dowolnego tekstu objaśniającego działania realizowane przy pomocy użytych rozkazów mikroprocesora; w szczególnym przypadku komentarz może zaczynać w dowolnym miejscu linii programu, także od pierwszej kolumny (z pominięciem pozostałych pól). AVRStudio dopuszcza ujęcie komentarza w nawiasy: /* ...... */ komentarz taki może rozciągać się na wiele linii
Przeznaczenie etykiet: 1. Identyfikatory adresów w przestrzeni adresowej procesora - wskazują: adresy skoków, np: tutaj: in r7,portb adresy początkowe wywoływanych procedur, np: call dod3B ;dodaj liczby 3-bajtowe adresy początkowe struktur danych, np: tablica1: .db 12,234,0,11 //tablica liczb 1-bajtowych
Przeznaczenie etykiet: 2. Identyfikatory stałych programowych, - ułatwia to ich użycie w tekście programie - zwiększenie czytelności programu, np: .equ CR =13 ;definicja znaku ASCII 3. Identyfikowanie zmiennych programowych, poprzez przypisanie im np. dyrektywą EQU adresu początkowego, np: .equ data =0x70 ;zmienna przechowujaca dzien mies. .... ldi r28,low(data) ;Y:=adres zmiennej ‘data’ ldi r29,high(data)
Stałe: są to wartości liczbowe lub znakowe zdefiniowane na etapie asemblacji programu lub pobierane z innych programów w procesie łączenia (linkowania). Przykłady: stała znaczenie reprezentacja binarna ‘A’ pojedynczy znak ASCII 41h "tekst" ciąg znaków ASCII 74h,65h,6Bh,73h,74h 787 liczba dziesiętna 0313h 0b100,0B100 liczba binarna 04h 0x2AF liczba szesnastkowa 02AFh 0X2A0 liczba szesnastkowa 02A0h $F00 liczba szesnastkowa 0F00h 0457 liczba ósemkowa 012Fh identyfikator o przypisanej wartości zgodna z wartością
Wykorzystanie wyrażeń. Przykładowo, zamiast sekwencji deklaracji: .equ zmienna1= 0x68 .equ zmienna2= 0x6A .equ zmienna3= 0x6C .equ zmienna4= 0x70 możemy zapisać: .equ zmienna1= 0x68h .equ zmienna2= zmienna1+2 .equ zmienna3= zmienna2+2 .equ zmienna4= zmienna3+4 Wynik asemblacji - taki sam, ale przy drugim zapisie łatwiejsze poprawki
Dostępne operatory wyrażeń
Dostępne funkcje
Podstawowe dyrektywy asemblera
Podstawowe dyrektywy asemblera
Podstawowe dyrektywy asemblera
Podstawowe dyrektywy asemblera
Pozostałe dyrektywy asemblera - segmenty programu
Pozostałe dyrektywy asemblera - segmenty programu Segment danych (.DSEG) może zawierać dyrektywy: .ORG, .DB, .DW, .DD, .DQ, .BYTE, .EQU; nie może zawierać instrukcji procesora; służy zadeklarowaniu struktur danych w obszarze pamięci danych; licznik bajtów danych startuje automatycznie od 60h; dyrektywy .DB, .DW, .DD, .DQ, jedynie rezerwują odpowiednie fragmenty tej pamięci danych – bez jej inicjacji na podane wartości. Przykład: .dseg .equ tablica = 0x80 ;tablica od adresu 80h .dq 0 ;wyzerowane bajty od 60h do 67h zmienna1: .byte 2 ;2-bajtowa zmienna1 od 68h zmienna2: .byte 2 ;2-bajtowa zmienna2 od 6Ah .org 0x70 zmienna4: .byte 4 ;4-bajtowa zmienna4 od 70h .equ zmienna3 = zmienna2+2
Pozostałe dyrektywy asemblera - segmenty programu Segment pamięci EEPROM (.ESEG) może zawierać dyrektywy: .ORG, .DB, .DW, .DD, .DQ, .BYTE, .EQU; nie może zawierać instrukcji procesora; służy zadeklarowaniu struktur danych w obszarze pamięci EEPROM; licznik bajtów EEPROM startuje automatycznie od 00h; dyrektywy .DB, .DW, .DD, .DQ rezerwują odpowiednie fragmenty tej pamięci danych wraz z ich inicjacją na podane wartości;
Pozostałe dyrektywy asemblera - makroasemblacja
Makroasemblacja - przykład .macro pulse_clk ; generuje jeden impuls taktujacy nadawanie ; @0 - PORTx ; @1 - numer bitu w wybranym porcie @0 sbi @0,@1 cbi @0,@1 .endm . . . sbi portd,outpin ;ustawienie sygn. wyj. pulse_clk portd,clkpin ;wyslanie ciagu bitow: cbi portd,outpin ; 1000 pulse_clk portd,clkpin
Pozostałe dyrektywy asemblera - asemblacja warunkowa możliwych jest 5 poziomów (zagnieżdżeń) asemblacji warunkowej
Pozostałe dyrektywy asemblera - asemblacja warunkowa Przykładowo, pewne fragmenty można asemblować gdy są do zrealizowania na danym mikrokontrolerze: .ifdef spcr /* powyzszy warunek jest spelniony gdy w zadeklarowanym dyrektywa .include pliku “*inc.asm” wskazujacym na docelowy uC jest przypisany adres I/O nazwie “spcr” charakterystycznej dla uniwersalnego rejestru szeregowego realizujacego standard SPI */ ; przygotowanie sprzetowego SPI do pracy ldi rtmp,0b00010000 ;wlacz.SPI w master out spcr,rtmp ldi rtmp,0b00000001 ;SCKfreq=fosc/2 out spsr,rtmp .endif /* inne mozliwe sprawdzenie: “.if spcr & spsr” tzn. czy obu rejestrom przypisano adresy rozne od zera */
Pozostałe dyrektywy asemblera - asemblacja warunkowa ;realizacja nadawania: .if spcr & spsr out spdr,r18 ;wyslanie bajtu wyjsciowego wait1: sbis spsr,spif ;sprzetowym SPI rjmp wait1 .else ldi r17,8 ;licznik bitow nxtbit:cbi portb,sdipin ;SDO:=0 sbrc r18,0 ;skok gdy r18.bit0=0 sbi portb,sdipin ;SDO:=1 sbi portb,sckpin ;impuls zegara cbi portb,sckpin lsr r18 ;nastepny bit dec r17 brne nxtbit .endif
Pozostałe dyrektywy asemblera - generacja komunikatów można wygenerować dodatkowy komunikat gdy zachodzi jakiś warunek: .if c1 > c2 ;jezeli stale programowe spelniaja ; podany warunek to sa nieprawidlowo ; zadeklarowane co trzeba zasygnalizowac .error “c1 nie moze byc wieksza od c2” .endif