ja tak z marszu sam nigdy nie pamiętam ale wtedy też sam zaglądam do swoich poradników - a czy widziałeś może ten ?
https://www.youtube.com/watch?v=4jIIOERYnwYPoza tym, kod który pokazałeś można jeszcze nieco zoptymalizować w C a co za tym idzie także w asemblerze ...
Ale zanim coś zaproponuję to zapytam bo nie pamiętam ? czy ty piszesz dobrze programy w asemblerze ? czujesz się w nim jak ryba w wodzie? Dlaczego pytam? Bo jeśli nie do końca czujesz się dobry w ASM to niestety swoją wstawką możesz to niechcący zrobić np gorzej (dłużej) niż to zrobi sam C ....
dlatego kolejne pytanie - czy sprawdzałeś plik *.lss i jak wygląda kod tej funkcji po kompilacji do ASM ? czy uważasz, że można go skrócić ? Moim zdaniem jest dość bardzo optymalny proszę:
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
no ale dobrym przemyśleniem kodu w C - można go jeszcze ciut stuningować
przypomnę twoja funkcja wygląda oryginalnie tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
jak chodzi o to co wyżej pokazałem w ASM z pliku *.lss
No to teraz powiedz mi też czy korzystasz w ogóle np z programu Eclipse Gadget bo on też już na pierwszy rzut oka pomaga oceniać pewne nasze działania w C w aspekcie tego jak to wygląda później w ASM we flashu - zobaczmy ile pokazuje zajętości flasha w byle testowym programie pustym prawie z tą funkcją:
no to teraz pomyśl - w KAŻDYM warunku IF() odwołujesz się jakby bezpośrednio do pamięci za pomocą wskaźników *data oraz *data1. Oczywiście jak widać po kodzie ASM na górze kompilator i tak był mądry
i wrzucił na początku te dane do rejestru, czyli sam zoptymalizował twoje podejście - chodzi o ten fragment:
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i później jak widzisz - już całość leci tzn jest sprawdzane z rejestru r24 a nie z RAM więc DUŻO szybciej
oczywiście później jest gdzieś przeładowany znowu na potrzeby *data1
ale może by tak od razu w C to zrobić, żeby kompilator zauważył, że my sami mocno kombinujemy w celu polepszenia kodu że tak powiem, to może jeszcze lepiej uda się wymyślić mu dla nas swoją optymalizację ?
w takim razie napiszmy twoją funkcję od nowa ale właśnie na tych zasadach jak to "za twoimi" pleckami zrobił kompilator w ASM
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
teraz widzisz co zrobiliśmy ?
idąc w ślad za kompilatorem w ASM sami powołujemy sobie jedną zmienną ze specyfikatorem "register" aby dać znać kompilatorowi (poprosić go) - te stary - powołaj oddzielny rejestr i wrzuć do niego najpierw daną z *data i dalej porównuj już szybciej na tym rejestrze ... zaś w środku funkcji przeładujemy do niego *data1
no to LU! - i proszę najpierw rzut oka na Eclipse Gadgeta
i banan na twarzy - micha się cieszy bo jak widzimy -12 bajtów to znaczy, że pewnie będzie lepiej (choć wiadomo - nie zawsze tak musi być)
no ok to zajrzyjmy do pliku *.lss do ASM
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
nie wiem jak ty - ale moim zdaniem kod nie tylko jest krótszy więc zaoszczędzamy od razu ileś dodatkowych cykli zegara bo jest też bardziej optymalny od poprzedniego.
Owszem i tak obydwa pięknie posługują się NAJKRÓTSZYMI instrukcjami
sbi
cbi
na potrzeby banglowania bitami - więc nawet poprzednia wersja nie jest taka zła - no ale ta ciut lepsza
czy można jeszcze to jakoś zoptymalizować pisząc to od nowa i w całości tylko jako wstawkę ASM ? nie wiem - pewnie można - ja już dawno nie ćwiczyłem asemblera więc nie wymyślę nic na gwałt ale też mam przeczucie, że no krócej się już nie da
------------------------ [ Dodano po: 2 minutach ]Uwaga na koniec, jeśli ta funkcja wykonuje się szybko - a tobie brakuje czasu to może też (być może - tak się tylko domyślam) być tak, że dookoła tej funkcji masz jakiegoś czaso-pożeracza - tzn np nieoptymalnie zorganizowaną jakąś pętlę gdzie tę funkcję wywołujesz itp itd