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?
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ć.
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.
.... 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.... :)
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.
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ą.
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.