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.
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:
: [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.
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
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ę.
: [rejestr]” = r,,(PCRTb)
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 „ [n ” w 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.
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.
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.
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. ' ' —____
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.
Październik 2005
■■