cz5 9

cz5 9



Programowanie


wej, makro _SFR_IO_ADDR dokonuje jego zamiany na 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 to 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”Ca)

:[port]”1”(_s FR_I0_ADDR(PORTB)));

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

asm volati!e

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ę tęgo spodziewałeś:., ba... czasami w ogóle nie pojawi się w kodzie wynikowym. Jest to związane z włączoną optymalizacją. Jeśli kompilator wykryje, że zmienna a nie jest nigdzie dalej wykorzystywana, po prostu usunie napisany przez nas kod. W tym prostym przypadku jest to zjawisko nawet pozytywne, jednak jeśl i chcemy mieć pewność, żę kompilator nie zmieni naszego kodu, możemy za słowem asm umieścić słowo volati!e. Zabrania to 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.

Najczęściej stosowane typy parametrów

oznacza miejsce

Rejestry górne

r16 do r31

Rejestry dolne

rO do r15

Dowolny rejestr

r0dor31

Sześciobitowa stała 0-63

Ośmiobitowa stola

0-255

Wskaźnik

x, y, z

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

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ć sobie z tym za pomocą jednej instrukcji. Aby nie 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 nadaną wcześniej pierwszemu nazwę:

asm volatile(“swap %[rejestr]”

:[rejestr]”=r”Cportb) rejestr”(portb));

W tym przypadku kompilator przed wywołaniem naszej wstawki skopiuje do wybranego przez siebie rejestru dane z rejestru PORTB, ą po wykonaniu zamiany połówek skopiuje infonnację z rejestru ną PORTB.

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 tylko poje

dyncze instrukcje. Umieszczenie większej ich ilości wymaga przynajmniej oddzielenia każdej z nich znakiem końca linii. Uwaga-mowa lulaj o znaku końca linii w znaczeniu napisu (łańcucha znaków)! Konieczne jest więc użycie sekwencji \ń” w kodzie. Znak końca linii, w znaczeniu [ENTBR] naciśnięty w edytorze nie przenosi się do:napisu. Zaleca się kończenie każdej instrukcji sekwencją    co spowoduje,

że w generowanym listingu (plik *.lst) formatowanie naszej wstawki będzie takie samo 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.

Global ność 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. Daje nam to, między innymi, niebezpieczną możliwość skoczenia z dow'oinego 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 zabronione i uniemożliwia kompilację programu. Rozwiązaniem problemu jest wykorzystanie w nazwie etykiety sekwencj i znaków Sekwencja ta zostanie zamieniona na cyfrowy kod, inny dla każdego wywołania asemblera. Dobrze jest przyjąć,: aby każ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 nic 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łatwi zrozumienie umieszczonych tam informacji.


astępnych


irach EdW • w następnych numerach EdW •

Lampowy wzmacniacz gitarowy


Mimo wszechwładnej elektroniki opartej na półprzewodnikach, wzmacniacze lampowe nie odeszły do lamusa, lecz nadal mają licznych wielbicieli. Entuzjastom gitary elektrycznej przedstawiony zostanie w EdW prosty i tani lampowy wzmacniacz gitarowy. Posiada kilka regulatorów, dzięki którym można regulować i tak niezwykle brzmienie.

Stabilizator impulsowy 12V 10-20A

Opisany w artykule stabilizator impulsowy, mimo rozbudowanej budowy, ma niepodważalne zalety w postaci wysokiej sprawności, która przekłada się na matę rozmiary i niski koszt budowy. Można go wykorzystać do budowy zasilacza, ładowarki akumulatorów lub też do obniżenia napięcia instalacji samochodów ciężarowych.

Październik 2005


Wyszukiwarka

Podobne podstrony:
cz5 2 Programowanie Programowanie Makro różni się od prostej definicji stałej tym, że dodatkowo zawi
cz5 1 Programowaniew (B W dniu dzisiejszym zmierzymy się z wyświetlaczem alfanumerycznym LCD, co jes
cz5 3 Programowanie Listing 22 LCD: komendy sterujące U Komendy sterujące wyświetlaczem #define
cz5 4 Programowanie Programowanie Rys. 26 przebieg obliczeń w funkcji LCDsendHalf. W C parametry do
cz5 5 Programowanie ABC... C Napisy w C Napisy w C tworzą tak zwane łańcuchy znakowe. Idea jest bard
cz5 6 Programowanie Programowanie listing 29 Pisanie na LCD. LCDstr("W-jtaj!");
cz5 8 ProgramowanieKoniec pierwszej tury W ten oto sposób kończymy prostą obsługę wyświetlacza. Napi
strona 14 T.Ziębakowski: PROGRAMOWANIE MAKR...1. Makro wypisuje zakupy z grupy rozrywka w zakresie K
Program specjalizacji w alergologii b) Sprawdziany umiejętności praktycznych Dokonuje się w trakcie
Ogólnopolski Próbny Egzamin Ósmoklasisty-3-5 grudnia 2019- PROGRAM WSPARCIA DLA SZKÓŁ io września PO
maszyny 2 p Jdi;oT utAv.fe» u fMuĄ ^ reŁp^fcjo^    O r 1 ^hSTTp3 T°^ *•• Sfr^io,j(^c4
strona 14 T.Ziębakowski: PROGRAMOWANIE MAKR...1. Makro wypisuje zakupy z grupy rozrywka w zakresie K
Image18 Iza! Dzisiaj na kolokwium z programowania w zasadzie nie było nic nowego poza jednym zadanie
czytanego tekstu, wyszukuje potrzebne informacje zawarte w tekście oraz dokonuje jego prostej
Slajd8 (29) Agenci programowi (1/3) Agent programowy (ang. software agent) - autonomiczny proces zdo

więcej podobnych podstron