Wpis z mikrobloga

#avr #arduino #atmel #gcc #assembler
Możecie mi powiedzieć czemu jak oglądam plik asm jakiegoś programu napisanego na avr'a to kompilator nie używa rejestrów z zakresu r2-r13? I po co ciągle używa r0 i r1 do trzymania tam zera i odkładania go na stos i do zdejmowania tego zera ze stosu? Zupełnie nie rozumiem.
Dlaczego wchodząc do przerwania jest cała kombinacja typu:
push r1
push r0
lds r0, 0x005F - 5f to adres rejestru stanu procesora
push r0
eor r1, r1
długo długo nic
pop r0
sts 0x005F, r0 - przywraca stan rejestru procesora
pop r0
pop r1

mógłby zrobić to tak:
push r2 (r2 i tak do niczego nie używa ale wywalimy na stos)
lds r2, 0x005f (mamy to samo zamiast na stosie to w r2)
długo długo nic
sts 0x005f, r2 (przecież i tak nie użył r2)
pop r2

Ktoś to rozumie, ma (to pierwsze) jakiś pierwotny sens?
  • 5
@Analityk: Poczytaj datasheeta Atmegi co do rejestrów. Od r0 do r15 bodajże to rejestry specjalne, dopiero wzwyż to rejestry ogólnego przeznaczenia. R0, R1 i r2 to jeśli dobrze pamiętam wskaźniki X, Y, Z.
@gorfag: http://pastebin.com/e6QVhPax
Listing przedstawia wywołanie pustej funkcji przerwania dla -O1, -O2, -O3 oraz -Os

ISR(USART_RX_vect){
};

To jakaś abstrakcja.
Odkłada r1 na stos po to, by wyzerować wartość tego rejestru i nadpisać to odłożoną na stos wartością.
To wszystko można zawrzeć w:
in r2, 0x3f
out 0x3f, r2
reti
chociaż i tak jaki jest sens odkładać rejestr stanu procesora na stos i od razu go zdejmować?
Edit: No i czemu gcc