Image217

Image217



Programowanie I

Programowanie I

Najczęściej stosowane typy parametrów

oznaczenie

oznacza miejsce

Zakres

d

Rejestry górne

r16 do r31

I

Rejestry dolne

rO co r15

r

Dowolny rejestr

rO do r31

I

Sześcbbitowa stała

0-63

M

Ośmiobitowa stała

0-255

e

Wskaźnik

x, y, z


w ej, makro _SFR_10_ADDR dokonuje jego zamiany nu przestrzeń wejścia-wyjścia - czyli w praktyce odejmuje od adresu 0x20.

Dostęp do parametrów

W kodzie asemblerowym, aby dostać się do odpowiedniego parametru, wykorzystujemy znak % oraz cyfrę oznaczającą numer parametru. Numeracja parametrów zaczyna się od 0.

W praktyce jest 10 bardzo niewygodne. Nie wiem, czemu informacja ta nie znalazła się w dokumentacji, ale istnieje możliwość nadawania parametrom nazw, z których można korzystać we wstawce. Drugi z naszych przykładów mógłby wyglądać następująco:

asm(“in %[wyj], %[port]"

[wyj] ,’=r,,(a)

: [port],,l”(_SFR_IO_ADDR(PORTB))) ;

Przyznasz chyba, żc forma ta wydaje się znacznie bardziej przyjazna? Taki zapis przede wszystkim zmniejsza możliwość popełnienia pomyłki. Nic będziemy wracac już do obsługi parametrów za pomocą numerków.

asm volatlle

Okazuje się, że często, gdy napiszesz według poprzedniego opisu jakąś funkcją w asemblerze, po skompilowaniu programu będzie ona wyglądała inaczej, niż się tego spodziewałeś... ba... czasami w ogóle nic pojawi się w kodzie wynikowym. Jest to związane / włączoną optymalizacją. Jeśli kompilator wykryje, żc zmienna a nic jest nigdzie dalej wykorzystywana, po prostu usunie napisany przez nas kod. W tym prostym przypadku jest to zjawisko nawet pozytywne. jednak jeśli chcemy mieć pewność, że kompilator nie zmieni naszego kodu, możemy za słowem asm umieścić słowo volatile. Zabrania lo kompilatorowi optymalizowania naszej wstawki i zmusza go do jej umieszczenia w kodzie nawet jeśli uzna. że jest ona niepotrzebna - w końcu jeśli piszemy już w asemblerze, chyba sami dobrze wiemy, co jest dla nas lepsze ;)

Typy parametrów

Najczęściej stosowane typy parametrów przedstawia tabelka w tej ramce. Nie są to wszystkie możliwości, jednak te, które są najczęściej wykorzystywane polecam zajrzenie do rozdziału 7.4 dokumentacji AVR-GCC. gdzie znajduje się także tabela informująca, jakie typy

parametrów należy wykorzystywać dla poszczególnych instrukcji.

W samym kodzie możemy stosować jeszcze kilka predefiniowanych oznaczeń rejestrów specjalnych, które pokazuje następna tabelka

Predefiniowane oznaczenia rejestrów Symbol Rejestr _SREG_ Rejestr statusu

_SP_H_ Starszy bajt wskaźnika stosu

_SP_L__ Młodszy bajt wskaźnika stosu

_tmp_reg_ Rejestr tymczasowy - rO,

nie musi być odzyskiwany

_zero_reg_ Rejestr zera - r1 w AVR-GCC

zawsze zawiera 0

To samo wejście i wyjście

Wyobraźmy sobie, że w jakimś programie potrzebujemy zamienić miejscami dwie połówki bajtów pewnej zmiennej. W asemblerze możemy poradzić -iobie z tym za pomocą jednej instrukcji. Aby nic wprowadzać zbędnych przesłań, potrzebujemy możliwości zmuszenia kompilatora do wykorzystania tego samego rejestru jako wejście i wyjście. Możemy zrobić to jako typ drugiego z parametrów, wykorzystując nudaną wcześniej pierwszemu nazwę.

asm volatile(“swap %[rejestr]"

: [rejestr]” = r,,(PCRTb)

:”rejestr”(P0RTR));

W tym przypadku kompilator przed wywo-łaniem naszej wstawki skopiuje do wybranego przez siebie rejestru dane z rejestru PORTB, a po wykonaniu zamiany połówek skopiuje informację z rejestru na PORTD.

W nawiasach równie dobrze moglibyśmy umieścić jakąś zmienną. Jeśli będzie to zmienna lokalna - przesłania w ogóle nie będę wykonywane - nasza wstawka dostanie dostęp bezpośrednio do rejestru, w którym zmienna jest przechowywana.

Więcej instrukcji

Do tej pory w kodzie stosowaliśmy ty lko poje

dyncze instrukcje. Umieszczenie większej ich ilości wymaga przynajmniej oddzielenia każdej z nich znakiem końca linii. Uwaga-mowa tutaj o znaku końca linii w znaczeniu napisu (łańcucha znaków)! Konieczne jest więc użycie sekwencji „ [nw kodzie. Znak końca linii, w znaczeniu jENTER] naciśnięty’ w edytorze nie przenosi się do napisu. Zaleca się kończenie każdej instrukcji sekwencją „\n\t”, co spowoduje, że w generowanym listingu (plik *.lst) formatowanie naszej wstawki będzie takie samu jak formatowanie kodu generowanego przez kompilator.

Dla własnej wygody warto pisać każdą instrukcję w oddzielnym łańcuchu, w nowej linii. Jest to możliwe dzięki opisanej wcześniej zasadzie łączności łańcuchów znakowych. Odpowiednim przykładem jest listing 23 w tekście dzisiejszego odcinka.

Globalność etykiet
i ratunek: %=

Wszystkie etykiety, jakie wprowadzimy w nasz kod, mają zasięg globalny. Oznacza to. że pojawiają się bezpośrednio w asemblerowym kodzie jeszcze przed jego skompilowaniem z postaci symbolicznej Da e nam to, miedzy innymi, niebezpieczną możliwość skoczenia z dowolnego miejsca w kodzie do zupełnie innej wstawki. Przy zachowaniu ostrożności nie jest to bardzo uciążliwe do czasu, aż chcemy stworzyć asemblerowe makro. Wtedy przy każdym jego wywołaniu tworzymy etykietę o takiej samej nazwie. Jest to zabrooiune i uniemożliwia kompilację programu. Rozwiązaniem problemu jest wykorzystanie w nazwie etykiety sekwencji znaków Sekwencja ta zostanie zamieniona na cyfrowy kod, inny dla każdego wywołania asemblera. Dobrze jest pizyjąć, aby <ażda etykieta składała się z nazwy funkcji / makra, własnego oznaczenia wewnętrznego oraz sekwencji %=. Przykład ponownie na listingu 23.

Tracone rejestry

Jeśli potrzebujemy zużyć dodatkowy rejestr w naszej wstawce, tutaj należy umieścić o tym informację. Taka informacja jest konieczna, ponieważ kompilator może przechowywać w wybranym rejestrze ważne dane. Ogólnie korzystanie z tego pola nie jest zalecane.. jednak ze względu na kończące się miejsce ponownie polecam Ci przejrzenie rozdziału 7.4 dokumentacji. Ze swojej strony mam nadzieję, że tekst ten przede wszystkim ułatw i zrozumienie umieszczonych tam informacji.

• w następnych numerach EdW • w następnych numerach EdW •

dużej mocy

- m '


Lampowy wzmacniacz gitarowy

Mimo wszechwładnej elektroniki opartej na półprzewocnikach, wzmacniacze lampowe nie odeszły do lamusa, lecz nadal mają licznych wielbicieli. Entuzjastom g tary elektrycznej przedstawiory zostanie w FdW prosty i tan lampowy wzmacniacz

gitarowy. Posiada kilka regulatorów, dzięki któ^m można regulować    _____

i tak niezwykłe brzmienie.    ' ' —____


Stabilizator impulsowy 12V 10-20A

Opisany w artykule stabilizator impu sowy, mmo rozbjdowanej budowy, ma n epodważame zalety w postaci wysokiej sprawności, która przekłada się na małe rozmiary i niski koszt budowy. Można go wykorzystać do budowy zasilacza, ładowarki akumulatorów lub też dc obniżania napięcia instalacji samochodów ciężarowych.


48



Październik 2005


EI (


■■



Wyszukiwarka

Podobne podstrony:
13359 Image31 (4) ProgramowanieCzęść 3 t Najczęściej stosowane, standardowe pliki nagłówkowe udostęp
Streszczenie Praca ta stanowi przegląd algorytmów oraz technik programowania najczęściej stosowanych
Wykaz najczęściej stosowanych jednostek miar Oznaczenie Nazwa jednostki Oznaczenie Nazwa
METODY FIZYKOCHEMICZNE W najczęściej stosowanych metodach fizykochemicznych oznaczane sacharydy
Image212 Programowanie ■ W C parametry do funkcji przekazywane są przez wartość. Oznacza to, że
0000039 4 180 Przykładowe programy postępowania pacjenta do operacji. Oznacza to nie tylko stosowani
cz3 Programowanieymumuma]^W IMlD ©    c* Najczęściej stosowane, standardowe pliki
Image219 (3) Programowanie 1. Nie tworzymy komunikatu o kodzie 0 - ten kod został zarezerwowany do o
Zdjęcie3722 Załąc/ntk 2Wyka/ niektórych programów komputerowych stosowanych w zwalczaniu hałasu i wi

więcej podobnych podstron