1. Do R16 dlatego, że ta część rejestrów roboczych jest 'najbardziej' ogólnego przeznaczenia. W procesorach AVR nie ma jednakowego dostępu do wszystkich rejestrów roboczych. Przykładowo instrukcja
ldi może operować wyłącznie na górnej połówce rejestrów, z kolei instrukcj mnożące operują tylko na fragmencie górnej połówki rejestrów. R16 i R17 to para rejestrów, która jest używana jako 'akumulatory' ogólnego przeznaczenia , na których wykonuje się wszelkie operacje ładowania danych, liczenia etc. Każda instrukcja ma dostęp do tych rejestrów.
2. Znacznik C z rejestru SREG to znacznik przeniesienia. Przykładowo jego znaczenie jest ważne przy dodawaniu liczb 16-bitowych. Dodając do siebie młodsze bajty owej liczby może nastąpić przepełnienie rejestru 8-bitowego (np. dodając do siebie 192 i 225) i wtedy ustawiany jest znacznik C. Można go potraktować jako przedłużenie rejestru z 8 do 9 bitów. Następnie dodając starsze bajty danej liczby 16-bitowej, dodajemy zawartość znacznika C, co w konsekwencji daje poprawny 16-bitowy wynik dodawania (wynika to z natury liczb binarnych). Tak samo przy wykonywaniu instrukcji przesuwania bity wypychane ładowane są kolejno do znacznika przeniesienia.
W podanym przeze mnie programie
lsl R16 wysuwa kolejne bity zmiennej od MSB do LSB, które następnie instrukcją
ror R17 ładowane są do uprzednio wyzerowanego R17. R18 to licznik zapętleń, przesuwanie trzeba wykonać 8x. Szczegółów możesz poszukać w kartach katalogowych AVR (lista instrukcji).
Gratuluję, jeśli zrozumiałeś o co mi chodzi
