Aktywne Wpisy
niebieski_kot +13
Czy karteczka "Bardzo proszę o respektowanie ciszy nocnej, przynajmniej w dni robocze" będzie ok jak wrzuce do skrzynki tej durnej cipie co drze #!$%@? od 23
Szyszkalogin +15
#przegryw A wy zazdrośni #glodnyjakpies
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?
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