Narzędzia użytkownika

Narzędzia witryny


elektronika:avrgccasm

Pisanie procedur w asemblerze AVR w języku C

Zapis

Poniżej symboliczny zapis wstawki asemblerowej w języku C:

asm(code : output operand list : input operand list [: clobber list]);

Poszczególne części są oddzielone od siebie dwukropkami. Objaśnienie poszczególnych pól:

  • code - kod asemblera w dość specyficznej postaci (patrz przykład poniżej),
  • output operand list - lista parametrów wyjściowych (tam gdzie zapisujemy wynik),
  • input operand list - lista parametrów wejściowych (tam skąd pobieramy dane).
  • clobber list - opcjonalnie (łącznie z dwukropkiem), czy kod asemblera coś zmienia? Np. jakie rejestry, pamięć.

Do poszczególnych operandów (mogą być to zmienne C, rejestry, itd.) odwołuje się poprzez ich numer porządkowy, tj. „%0” - pierwszy operand, „%1” - drugi operand, itd. Możliwy jest też dostęp do poszczególnych bajtów za pomocą nazw: %A0 - pierwszy bajt (A) pierwszego operandu (0), %B0 - drugi bajt (B) pierwszego operandu (0), %A1 - pierwszy bajt (A) drugiego operandu (1).

A oto rzeczywisty przykład:

inline void delay( int count )
{
	asm volatile(
		"sbiw **%A0**, 0x01" "\n\t"
		"ldi __tmp_reg__, 0xff" "\n\t"
		"cpi **%A0**, 0xff" "\n\t"
		"cpc **%B0**, __tmp_reg__" "\n\t"
		"breq dl_ret%=" "\n\t"
		"dl_loop%=:" "\n\t"
		"sbiw **%A0**, 0x01" "\n\t"
		"cpi **%A0**, 0xff" "\n\t"
		"cpc **%B0**, __tmp_reg__" "\n\t"
		"brne dl_loop%=" "\n\t"
		"dl_ret%=:" "\n\t"
		:: "r" (count)
	);
}

Kod to instrukcje asemblera w cudzysłowach zakończone znakiem nowej linii i tabulacji. Asembler poprawnie interpretuje kod jeśli linia zaczyna się od tabulacji (nie dotyczy pierwszego wiersza). Dalej mamy pustą listę operandów wyjściowych (brak znaków pomiędzy dwukropkami). Lista operandów wejściowych zawiera tylko „count”, literka „r” oznacza że może to być dowolny rejestr. Każdy operand musi mieć przypisaną rolę za pomocą literki - pełną listę można zobaczyć na stronie AVR libc (patrz linki). Po co to jest? Dzięki odpowiedniemu oznaczaniu poszczególnych operandów kompilator może nasz kod odpowiednio zoptymalizować.

Linki

elektronika/avrgccasm.txt · ostatnio zmienione: 2016-01-13 22:48 przez Łukasz Góralczyk