Strony

niedziela, 6 kwietnia 2014

Wstawki ASM w AVR GCC - część 01

Witam,

Dzisiaj po dość długiej przerwie w kręceniu poradników, chciałbym wam przedstawić dwu- , może trzy- częściowy poradnik na temat tworzenia wstawek asemblerowych w języku C (AVR GCC). Co mnie do tego skłoniło ? W sumie prosta rzecz. Tym razem miałem nakręcić kolejną część poradnika na temat Magic LED'ów. Ale jak się okazało, po wielu próbach - wykładałem się wciąż na wyjaśnieniach dotyczących właśnie wspomnianych w tytule wstawek asemblerowych. Okazywało się bowiem, że muszę przejść przez nie dość szczegółowo aby wyjaśnić istotę działania najniższych procedur służących do sterowania tymi diodami, ale wciąż czegoś mi brakowało. Tym czymś - okazały się przynajmniej jakieś podstawy dotyczące zagadnienia tworzenia takich wstawek. Koniec końców - okazało się, że najpierw nakręcę poradnik niejako oddzielny tematycznie - bo o wstawkach ASM ale jednak ściśle łączący się z Magic LED'ami ;) .... Dzisiaj prezentuję pierwszą taką dość luźną (i troszkę przegadaną na początku) część tego poradnika. Dlaczego przegadaną ? ano dlatego że miałem dłuższą przerwę no i też nie ukrywam że z okazji "piko ZLOTU - LINK" forumowiczów ATNEL, jaki odbył się w Bydgoszczy! ;) Przy okazji dziękuję wszystkim obecnym, że byliście ze mną. ... Mam nadzieję, że za te kilka nadmiarowych minut mnie nie zlinczujecie i spokojnie dotrwacie do początku poradnika. Oczywiście - zaczynam hmmm jakby od zupełnych podstaw w sensie opisania konkretnego przykładu, który najpierw zostanie przygotowany w czystym C a dopiero później w asemblerze jako wstawka. Wszystko to po to aby mieć dobre porównanie jak mają się wstawki asm do C oraz co? jak? i z czym się "zajada" ;)


zapraszam:


;)

4 komentarze:

  1. Witamy po długiej przerwie Panie Mirku.
    Kurcze,fajny poradnik, tyko że w najważniejszym momencie sie skończył :-)
    Łapki w góre i czekamy na kolejny.
    Pozdrawiam,Piotr.

    OdpowiedzUsuń
  2. Witamy Mirku po dłuższej przerwie oczywiście łapki w górę i czekamy na ten kremik na ciachu aby było w czym język zanurzyć

    OdpowiedzUsuń
  3. Witam. Dopiero raczkuje w C, czytam BB, ale zadam pytanie może wydać się głupie i wynikające z mojej niewiedzy. Otóż, dlaczego w funkcji mk_roll_left() użyto wskaźnika *k do zmiennej rolka? Czy nie można było rolować samą zmienna rolka wewnątrz tej funkcji bez użycia wskaźnika? Przyznam że nie wiem jakie z tego tytułu wynikają różnice i w jakich przypadkach lepiej używać zmiennej a kiedy użyć wskaźnika do niej. Będę wdzięczny za odpowiedź. Dziękuję i pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. Tu nie chodzi o wyższość jednej metody nad drugą albo że jedna jest lepsza a druga gorsza. Być może jeszcze nie doczytałeś w Bluebooku na temat działania samych funkcji oraz tego co i jak dzieje się z argumentami przekazywanymi przez wartość - czyli gdybyśmy przekazali do tej funkcjo po prostu samą zmienną ( rolka ). A czym różni się to od tego gdy przekazujemy argument przez wskaźnik czyli ( &rolka ).

      Tu wychodzi po prostu potrzeba założeń tego projektu. Pomyśl sobie - mamy mieć zmienną gdzieś zdefiniowaną - nie ważne czy globalną czy lokalną i to w niej będzie wciąż kręcił się w kółko bajt - zgadza się ?

      I teraz - gdybyśmy przekazali przez wartość ( rolka ) .... to dioda czy diody stałyby w miejscu :( ... dlaczego ? Ano dlatego że za każdym razem funkcja asemblerowa zmieniałaby wartość (UWAGA!) K O P I I zmiennej wewnątrz funkcji mk_roll_left(). Funkcja przy wyjściu - niszczy kopię ze stosu.

      Dlatego potrzebujemy mieć cały czas dostęp do pewnej zmiennej gdzieś tam zdefiniowanej i dlatego przekazujemy wskaźnik do niej - aby wstawka asemblerowa mogła właśnie jej zawartość zmienić po przesunięciu bitów. A gdy zakończy się funkcja mk_roll_left() ... to nic się nie stanie ;) zmienna rolka i tak będzie miała już przesuniętą zawartość.

      Usuń