Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

mega32 - przejście z C do ASM

ASMnauka 13 Mar 2013 20:31 1839 19
  • #1 13 Mar 2013 20:31
    ASMnauka
    Poziom 12  

    Dobry wieczór.
    Mam wiele pytań dotyczących ASM, jednak zacznijmy od początku.

    W C występują pętle, jednak w ASM ich nie ma, lub nie mogę sobie sobie z nimi poradzić.

    Owszem czytam wiele poradników, lecz nie ma tam nic o pętlach, natomiast są skoki, np.
    skok względny, gdy równe = BREQ
    skok względny = RJMP

    Czy faktycznie w ASM pętle nie występują ?

    0 19
  • #2 13 Mar 2013 20:44
    BlueDraco
    Specjalista - Mikrokontrolery

    Jak to nie ma? Oczywiście, że są, tylko inaczej się je zapisuje. Najprościej jest zrobić pętlę ze skokiem warunkowym zamykającym, umieszczonym na końcu pętli.

    Na Twoim miejscu jednak poważnie bym się zastanowił nad sensownością programowania AVR w asemblerze. Ta architektura jest przyjazna dla kompilatora i umożliwia wygodne i efektywne programowanie w C. Po co więc się męczyć?

    Pisze Ci to facet, który w życiu napisał parę setek tysięcy linii kodu asemblerowego.

    0
  • #3 13 Mar 2013 20:45
    Svavo
    Poziom 23  

    Są etykiety i skoki warunkowe - wszystko czego potrzebujesz do zrobienia pętli. Poczytaj, jest tego pełno w sieci.
    Pozdro.

    0
  • #4 13 Mar 2013 20:49
    tmf
    Moderator Mikrokontrolery Projektowanie

    Jako jakieś małe wstawki w C to asembler jak najbardziej warto poznać i sporadycznie używać.
    Pętle w asm robi się całkiem podobnie jak w C, np.:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    zamieniasz na:
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    i masz ładną pętlę. Warto zobaczyć na wygenerowany z kompilacji C plik lss, gdzie masz tłumaczenie na asembler. Dużo się rozjaśni.

    0
  • #6 16 Mar 2013 20:05
    ASMnauka
    Poziom 12  

    Dziękuję bardzo za zainteresowanie.
    A w szczególności Koledze bgolab.

    Jednak nauka nie idzie w las.
    Napisałem taką oto pętlę z dwoma warunkami.
    Pętla ta wykona sie jedynie dwadzieścia razy, po czym nastąpi skok do etykiety Nie.

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Dowiedziałem się o ciekawej książce pod tytułem "Mikrokontrolery AVR w praktyce" autora Jarosława Dolińskiego.
    Zamówiłem tą książkę i czekam na nią.
    Zapewne będzie mi pomocna przy nauce.

    Pozdrawiam

    0
  • #7 16 Mar 2013 20:22
    tmf
    Moderator Mikrokontrolery Projektowanie

    Nie wiem po co męczysz ten asembler, ale tak dla edukacji to twoja pętla nie jest za dobra. Po pierwsze nigdzie nie inicjujesz R17, więc to, że wykona się 20 razy to tylko twoje życzenie :) Po drugie, zazwyczaj robi się w pętlach dekrementację, a nie inkrementację - w ten sposób odpada CPI, bo po DEC flagi rejestru stanu procesora są ustawiane automatycznie. Analogicznie możesz robić inkrementację, ale wtedy testujesz wystąpienie nadmiaru (overflow).

    0
  • #8 16 Mar 2013 21:12
    excray
    Poziom 39  

    BREQ jest tutaj niepotrzebne.

    Dodano po 9 [minuty]:

    tmf napisał:
    Po drugie, zazwyczaj robi się w pętlach dekrementację, a nie inkrementację - w ten sposób odpada CPI, bo po DEC flagi rejestru stanu procesora są ustawiane automatycznie.

    Nawyk dekrementacji wynika raczej z pracy z rodziną 8051. W AVRach flagi aktualizują się zarówno po dekrementacji jak i po inkrementacji więc jak komu pasuje...

    0
  • #9 16 Mar 2013 21:12
    ASMnauka
    Poziom 12  

    Dziękuję tmf za odpowiedz.
    Męczę się by poznać to co i jak robi procesor.
    Jeśli chodzi o inicjowanie rejestrów, to myślę, że można je wyzerować, lub wpisać w nie jakąś wartość ?
    Oczywiście można również przypisać je do stałych ?
    Podaję poprawioną pętlę.

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #10 16 Mar 2013 21:22
    tmf
    Moderator Mikrokontrolery Projektowanie

    excray napisał:
    BREQ jest tutaj niepotrzebne.

    Dodano po 9 [minuty]:

    tmf napisał:
    Po drugie, zazwyczaj robi się w pętlach dekrementację, a nie inkrementację - w ten sposób odpada CPI, bo po DEC flagi rejestru stanu procesora są ustawiane automatycznie.

    Nawyk dekrementacji wynika raczej z pracy z rodziną 8051. W AVRach flagi aktualizują się zarówno po dekrementacji jak i po inkrementacji więc jak komu pasuje...


    Owszem, flagi się aktualizują, ale zapisując LDI R17, 20 wiesz, że chodzi o 20 obiegów pętli, robiąc pętlę z inc musisz zapisać ldi r17, 256-20, co jest raczej dziwaczne, niesądzisz?

    Dodano po 1 [minuty]:

    ASMnauka napisał:
    Dziękuję tmf za odpowiedz.
    Męczę się by poznać to co i jak robi procesor.
    Jeśli chodzi o inicjowanie rejestrów, to myślę, że można je wyzerować, lub wpisać w nie jakąś wartość ?
    Oczywiście można również przypisać je do stałych ?
    Podaję poprawioną pętlę.

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Rejestry możesz inicjować jak chcesz. W twoim przykładzie BREQ jest niepotrzebne. Jeśli pętla się skończy to masz gwarancję, że r17 zawiera 0.
    Już wcześniej ci to sugerowałem - napisz program w c, skompiluj i przejrzyj wygenerowany plik asemblera. Sporo można się z tego nauczyć.

    0
  • #11 16 Mar 2013 21:30
    ASMnauka
    Poziom 12  

    tmf W życiu nie pisałem programów na AVR w C.
    Jedynie na komputer małe aplikacje.
    Dla mnie programy na AVR w C są czarną magią.

    Czy nie warto zrobić dział na temat nauki ASM dla AVR ?

    0
  • #12 16 Mar 2013 21:59
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie warto, bo programowanie procesorów takich jak AVR czy ARM w asemblerze nie bardzo ma sens. Kompilator radzi sobie z tym lepiej niż przeciętny programista.

    0
  • #13 16 Mar 2013 22:00
    Svavo
    Poziom 23  

    Warto, bo czasem dobrze wiedzieć co zrobił za Ciebie kompilator.
    Warto, bo czasem przydają się wstawki asemblerowe.
    Ale nie o to chodzi w temacie...

    0
  • #14 16 Mar 2013 22:01
    BlueDraco
    Specjalista - Mikrokontrolery

    Czytać - jak najbardziej. Pisać - niekoniecznie. :)

    0
  • #15 16 Mar 2013 22:20
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Svavo napisał:
    Warto, bo czasem przydają się wstawki asemblerowe.

    Tia, ja na razie użyłem w swoim życiu dwóch i to tylko dlatego że nagle zapragnąłem zrobić "premature optimization" (;

    4\/3!!

    0
  • #16 16 Mar 2013 22:26
    Svavo
    Poziom 23  

    Freddie Chopin napisał:
    Svavo napisał:
    Warto, bo czasem przydają się wstawki asemblerowe.

    Tia, ja na razie użyłem w swoim życiu dwóch i to tylko dlatego że nagle zapragnąłem zrobić "premature optimization" (;

    4\/3!!

    No dobra, ja jak sobie dobrze przypominam to używałem asm chyba tylko do załączania przerwań zagnieżdżonych... ALE, czasem, w niektórych bibliotekach można napotkać proste funkcje w asm.
    Pozdro.

    0
  • #17 17 Mar 2013 17:47
    30402
    Użytkownik usunął konto  
  • #18 17 Mar 2013 19:23
    excray
    Poziom 39  

    Skoki warunkowe są ładnie opisane w datasheet. Zresztą jak wszystkie pozostałe rozkazy asm. Kwestia tylko aby zrozumieć o co chodzi w asemblerze a to wymaga dobrego zrozumienia działania mikroprocesorów. Co komuś po tłumaczeniu że skok się wykonuje w momencie gdy flaga C jest ustawiona jeśli ktoś nie wie co to jest ta flaga C i dlaczego i jak się ustawiła. Tak samo stos często stanowi poważną zagadkę dla początkujących. Jest to zbyt duży zasób informacji na post więc musisz sięgnąć po książki. Jeśli chodzi o same podstawy działania mikroprocesorów to polecam Ci książkę Piotra Gałka "Podstawy programowania mikrokontrolera 8051" albo kurs "Mikrokontrolery? To takie proste..." w EP 4/97 - 12/98. Co prawda dotyczą one rodziny 8051 ale ogólne podstawy, budowa i działanie mikroprocesorów są tam bardzo przystępnie opisane.

    0
  • #19 17 Mar 2013 21:44
    30402
    Użytkownik usunął konto  
  • #20 17 Mar 2013 23:43
    excray
    Poziom 39  

    Saabotaz napisał:
    ASM niech się uczy na AVR, zamiast czytać o 8051. To są różne procesory, w 8051 duża część programu to same MOV żeby coś załadować do alu, w AVR są 32 takie "alu" i pisze się znacznie przyjemniej.

    Z flagami nie ma problemu, trzeba tylko znaleźć dobry opis z wyjaśnieniem, takim łopatologicznym. Ale nikt takiego opisu jeszcze nie zrobił dla początkujących.

    No właśnie zrobił. Pan Piotr Gałka zrobił taki "łopatologiczny" opis. Dlatego polecam tamtą lekturę. Na AVR nic takiego nie spotkałem. A z tymi różnicami to przesadzasz. Jak ktoś załapie "system" na procesorze 8051 to bez problemu też zrozumie AVRy. Poza tym nie każę się uczyć asemblera i rejestrów z '51 na pamięć tylko przeczytać i zrozumieć ideę.

    0