[avr-gcc] Inline asm ...

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 :(

Reply to
Pawel Kurzawa
Loading thread data ...

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.

Reply to
Łukasz Góralczyk

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.