Witam, czy ktos kuma o co chodzi w tych magicznych skladniach inline asmeblera? Prosze moze o jakiegos linka do przykladow. To ze strony gcc to dla mnie black magic :(
[avr-gcc] Inline asm ...
Feb 22, 2005
1 Replies
formatting link
Początkowo może się to wydawać dość złożone, ale potem okazuje się, że wszystko jest fajnie zorganizowane. Pod tym linkiem znajdziesz przykłady. Ogólna zasada jest prosta:
asm volatile( "TUTAJ_KOD" : PARAMETRY_WYJSCIOWE : PARAMETRY_WEJSCIOWE [: NARUSZONE_ZMIENNE] );
Po to to jest, żeby kompilator wiedział, co wstawiony kod asemblera zmienia, jakie zmienne są zmieniane, jakie ma parametry wejściowe, jakie wyjściowe. Przez to kompilator nadal może wprowadzać optymalizacje i nie musimy się martwić co w którym rejestrze jest, operujemy na symbolach (np. najmłodszy bajt pierwszego parametry, itd.).
Postać PARAMETRY_WYJSCIOWE mozesz poczytac pod linkiem wyzej. Podaje sie tam, typ parametru i jego nazwe. Tu jest przyklad:
inline void delay( int count ) { register unsigned char tmpval; asm volatile( "sbiw %A0, 0x01" "\n\t" "ldi %1, 0xff" "\n\t" "cpi %A0, 0xff" "\n\t" "cpc %B0, %1" "\n\t" "breq dl_ret%=" "\n\t" "dl_loop%=:" "\n\t" "sbiw %A0, 0x01" "\n\t" "cpi %A0, 0xff" "\n\t" "cpc %B0, %1" "\n\t" "brne dl_loop%=" "\n\t" "dl_ret%=:" "\n\t" :: "r" (count), "r" (tmpval) ); }
%0 pierwszy operand, %1 drugi operand %A0 to najmłodszy bajt pierwszego operandu (parametru), %B0 to kolejny bajt, itd. %A1 to najmłodszy bajt drugiego operandu. %= używa się, aby generować unikalne nazwy etykiet.
Jak widać powyższa procedura asemblera nie ma nic na wyjściu ("::"), bo generuje tylko opóźnienie, ale za to ma 2 parametry wejściowe (":: "r" (count), "r" (tmpval)"). r oznacza, że to może być dowolny rejestr (może być też np. a, b, d, x, y, z - poczytaj), w nawiazach podaje się nazwę. Więc do count będziemy się odnosili przez %0, a to tmpval %1 (zaś do poszczególnych składowych przez %A0, %B0, itd.).
W tym linku jest wszystko fajnie opisane.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required