T.M.F.
Guest
Mon Dec 20, 2004 10:56 am
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.
Marcin E. Hamerla
Guest
Mon Dec 20, 2004 11:02 am
T.M.F. napisal(a):
Quote:
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?
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.
--
Pozdrowienia, Marcin E. Hamerla
"Jak ja was, xheeejl, nienawidzę, jak do was bym z kałacha bił."
T.M.F.
Guest
Mon Dec 20, 2004 11:23 am
Quote:
To za drugim razem, bede mial blad o powtorzeniu sie etykiety. No
wlasnie, czy da sie w ciele makra zdefiniowac takie "wewnetrzne" etykiety?
Wywolanie makra dziala tak, ze w miejscu wywolania po prostu wstawia
dany ciag instrukcji. Tak wiec wystapienie bledu jest prawidlowe.
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.
Quote:
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, 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;)
Marcin E. Hamerla
Guest
Mon Dec 20, 2004 12:07 pm
T.M.F. napisal(a):
Quote:
Wywolanie makra dziala tak, ze w miejscu wywolania po prostu wstawia
dany ciag instrukcji. Tak wiec wystapienie bledu jest prawidlowe.
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.
W sumie procedura niewiele sie rozni od makra, nieprawdaz?
Quote:
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, to jest jakis sposob, ale wymaga, zebym pamietal, ktory rozkaz ile
ma slow.
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
;--).
Quote:
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...
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.
Quote:
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;)
Tak wlasnie wywoluje sie procedury w assemblerze. To nie jest HLL.
--
Pozdrowienia, Marcin E. Hamerla
"Jak ja was, xheeejl, nienawidzę, jak do was bym z kałacha bił."
T.M.F.
Guest
Mon Dec 20, 2004 12:52 pm
Quote:
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.
W sumie procedura niewiele sie rozni od makra, nieprawdaz?
Niby niewiele, ale czasami to niewiele to b. duzo :)
Quote:
BTW jak juz tworzysz delaya w taki sposob w jaki go stworzyles, to
narzekanie na koniecznosc uczenia sie dlugosci rozkazow nie maja sensu
;--).
Nie no, to byl tylko przyklad. Wcale nie chodzi mi o makro, ktore
realizuje jakies opoznienie;P
Quote:
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.
Wiekszosc jest jednoslowowa, ale mozna sie niezle walnac. Poza tym potem
troszke zmienisz makro i juz wszystkie wartosci trzeba ponownie przeliczac.
Quote:
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;)
Tak wlasnie wywoluje sie procedury w assemblerze. To nie jest HLL.
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;)
Jurek Szczesiul
Guest
Mon Dec 20, 2004 5:06 pm
Mon, 20 Dec 2004 11:56:17 +0100, na pl.misc.elektronika, T.M.F. napisał(a):
Quote:
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.
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 ;-)
--
Pozdrowienia
Jurek Szczesiul
Slawomir Sidor
Guest
Mon Dec 20, 2004 6:57 pm
Quote:
W jaki sposob we wnetrzu makra zdefiniowac etykiete, tak, zeby ona byla
widoczna tylko w samym makrze?
Zawsze etykieta w makro jest lokalna.
Quote:
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?
Nie bedziesz mial. Nigdy takiego problemu nie stwierdzilem.
Wszystkie moje DELAYe uzywaja takich samych etykiet i dziala to bez
problemu.
--
Slawomir Sidor N 51 58.1385 E020 09.1966
T.M.F.
Guest
Tue Dec 21, 2004 11:51 am
Quote:
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 ;-)
Fakt. W nowym AVR-Studio jest tak jak mowisz.
A wiec problem rozwiazany, dzieki wszystkim za pomoc.