avr-gcc wielkość kodu

Sep 11, 2009 7 Replies

Witam.



Mam dwie zmienne lokalne typu unsigned int a,b; i dwa wskaźniki typu char *wsk1,*wsk2;



Zmienne te wykorzystuję w jednej funkcji. Chcąc wykorzystać je globalnie w innych funkcjach przeniosłem je do globalnych. Dlaczego po samym przeniesieniu ich rozmiar kodu urósł aż o 44 bajty?



Dzięki za pomoc Paweł


On Fri, 11 Sep 2009 12:30:41 +0200, pawel wrote: [ciach o zm. lok.]

Domyślam się że dorzucany jest kod do inicjacji zmiennych globalnych, zmienne lokalne nie muszą być inicjowane. Tutaj więcej: http://

formatting link
.

P.S. Ustaw czytnik tak aby wysyłał w jakim kodowaniu masz posty.

Łukasz Góralczyk pisze:

Skoro masz swój program przed nosem, to czemu nie porównasz plików wynikowych (*.lst, albo *.lss) z obydwu wersji (przy pomocy np. beyond compare), tylko liczysz na to, że na grupie jest wróżka?

Kod inicjalizacyjny jest niezależnie od tego czy jest co inicjalizować, czy nie. A przynajmniej gcc nie potrafi tego kodu usuwać.

Użytkownik pawel napisał:

Operacje na zmiennych lokalnych wykonywane są w miarę możliwości bezpośrednio na rejestrach. Są to rozkazy dwu-bajtowe (jedno słowo). Przeniesienie zmiennych do globalnych wymusza odwoływanie się do nich za pośrednictwem czterobajtowych rozkazów LD i ST. Przykładowo inkrementacja zmiennej lokalnej typu char przechowywanej w rejestrze to jeden rozkaz np: INC R16 zajmujący dwa bajty. Dla zmiennej globalnej zapamiętanej w pamięci RAM będzie to już sekwencja trzech rozkazów np: LD R16, [zmienna] // 4 bajty INC R16 // 2 bajty ST [zmienna], R16 // 4 bajty czyli z dwóch bajtów zrobiło się dziesięć.

Dla zmiennych typu int i wskaźników sprawa wygląda odpowiednio gorzej. Kompilator stara się to możliwie optymalizować wykonując co się da na rejestrach i dopiero na koniec zapamiętuje wynik w pamięci RAM pod adresem zmiennej.

Pozdrawiam Grzegorz

On Fri, 11 Sep 2009 16:10:20 +0200, Zbych wrote: [ciach]

Masz rację, teraz sprawdziłem dokładniej i różnica wynika z tego że zmienne globalne musi przechowywać z pamięci (odczyt zapis).

.... jest jeszcze gorzej , bo jeżeli chcesz użyć LD to najpierw trzeba adres zmiennej załadować do X,Y lub Z a jeżeli użyjesz LDS to zajmujesz 2 słowa ale sądząc po tych " // 4 bajty " to chyba o LDS koledze wlasnie chodzilo.... :)

Pozdrawiam Norbert

Użytkownik Norbert Jaros napisał:

Oczywiście ma Kolega rację. Chodziło mi o LDS i STS. Adresowanie pośrednie z offsetem kompilator używa do adresowania pól w zmiennych strukturalnych o ile jest to opłacalne (kilka odwołań pod rząd). Przy pojedynczym odwołaniu skompiluje do LDS/STS.

Pozdrawiam Grzegorz

Grzegorz Kurczyk pisze:

Warto przy tym pamiętać, że instrukcje LDS i STS mają podany bezwzględny adresu w drugim słowie rozkazu. Dlatego też są używane przez kompilatory do pobrań i zapisów zmiennych globalnych, których adresy określane są na etapie konsolidacji (linkowania). Ale jeżeli zmienna leży na stosie lub jest alokowana dynamicznie, LDS i STS do niczego się nie przydadzą.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required