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ł
Didn't find your answer? Ask the community — no account required.
�
Łukasz Góralczyk
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.
Z
Zbych
Ł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ć.
G
Grzegorz Kurczyk
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
�
Łukasz Góralczyk
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).
N
Norbert Jaros
.... 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
G
Grzegorz Kurczyk
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
A
Adam Dybkowski
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
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.