Makra w avr-studio

Dec 20, 2004 7 Replies

Witam! Mam taki problem z makrami w AVR-Studio, mam nadzieje, ze rozwiazywalny:) W jaki sposob we wnetrzu makra zdefiniowac etykiete, tak, zeby ona byla widoczna tylko w samym makrze? Zalozmy, ze mamy makro: .MACRO delay LDI R16,255 M1: DEC R16 BRNE M1 .ENDMACRO



I teraz jesli w programie uzyje czegos takiego: delay dealy



To za drugim razem, bede mial blad o powtorzeniu sie etykiety. No wlasnie, czy da sie w ciele makra zdefiniowac takie "wewnetrzne" etykiety? Pozdrawiam, T.M.F.


T.M.F. napisal(a):

Wywolanie makra dziala tak, ze w miejscu wywolania po prostu wstawia dany ciag instrukcji. Tak wiec wystapienie bledu jest prawidlowe. Zdaje mi sie, ze ja to kiedys omijalem, ale nie pamietam juz jak. Mozesz sprobowac wywolac rozkaz BRNE w taki sposob: BRNE $-x. W innych znanych mi assmeblerach $ to aktualne polozenie licznika rozkazow. X to liczbowa wratosc przesuniecia miedzy dwoma rozkazami. Chyba to bedzie w tym wypadku 1.

Tak, wiem, ze to tak dziala, ale nie chce mi sie wierzyc, ze tworcy assemblera dla AVR-Studio tego nie uwzglednili. W koncu po to sie pisze makra, zeby je wykorzystac wiecej niz raz...a nie zawsze ma sens pisanie procedury.

Tak, to jest jakis sposob, ale wymaga, zebym pamietal, ktory rozkaz ile ma slow. A tu sie czasami mozna naciac, nie mowiac juz o tym, ze dlugosc pewnych rozkazow zalezy od konkretnego typu procesowa AVR, czyli od razu rezygnujemy z przenosnosci makra pomiedzy platformami, o ile oczywiscie nie decydujemy sie na kolejna komplikacje, jaka sa dyrektywy warunkowe preprocesora...

A BTW - czy w tym assemblerku jest cos takiego jak definicja procedury? Oczywiscie moge wywolywac RCALL procedura, ale bardziej elegancko by bylo po prostu procedura;)

T.M.F. napisal(a):

W sumie procedura niewiele sie rozni od makra, nieprawdaz?

Albo rybki albo akwarium. Albo chcesz sie brudzic assemblerem i wtedy bierzesz C albo uczysz sie rozkazow. BTW jak juz tworzysz delaya w taki sposob w jaki go stworzyles, to narzekanie na koniecznosc uczenia sie dlugosci rozkazow nie maja sensu ;--).

Wydawalo mi sie, ze wiekszosc rozkazow jest jednoslowowa? - nie wiem, bo C uzywamy. Zreszta ja juz przestalem kodowac. Zauwaz, ze podany wyzej argument o przenosnosci uderza w taki sposob realizacji delaya jak Ty to zrobiles. BTW w 51 mogles wpisac jmp, ktory byl tlumaczony na ajmp, sjmp, ljmp w zaleznosci od potrzeby. Aby sie upewnic, ze rozkaz ma taka, a nie inna forme trzeba bylo po prostu wpisac ajp, sjp, ljmp.

Tak wlasnie wywoluje sie procedury w assemblerze. To nie jest HLL.

Niby niewiele, ale czasami to niewiele to b. duzo :)

Nie no, to byl tylko przyklad. Wcale nie chodzi mi o makro, ktore realizuje jakies opoznienie;P

Wiekszosc jest jednoslowowa, ale mozna sie niezle walnac. Poza tym potem troszke zmienisz makro i juz wszystkie wartosci trzeba ponownie przeliczac.

Tu sobie sam odpowiem. Mozna zdefiniowac etykiete, czy jak to nazwac, ktora bedzie tak jakby symbolem jakiejs operacji. A assembler kazde wystapienie przetlumaczy na ta operacje, wiec troszke na okolo, ale da sie osiagnac to co chcialem. Pozostaje ciagle tylko problem skokow w makrze;)

Mon, 20 Dec 2004 11:56:17 +0100, na pl.misc.elektronika, T.M.F. napisał(a):

To stwierdzony fakt czy przypuszczenie ? AFAIK chyba etykiety w makrach mają z założenia zasięg lokalny ( avrasm dopisuje swoją numerację żeby uniknąć konfliktów ) ( ale nie sprawdzałem - ja tylko w C ;-)

Zawsze etykieta w makro jest lokalna.

Nie bedziesz mial. Nigdy takiego problemu nie stwierdzilem. Wszystkie moje DELAYe uzywaja takich samych etykiet i dziala to bez problemu.

Fakt. W nowym AVR-Studio jest tak jak mowisz. A wiec problem rozwiazany, dzieki wszystkim za pomoc.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required