250 likes | 467 Views
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.
E N D
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
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;
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 pulse_clk portd,clkpin 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 bitownxtbit: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