AVR-G++ czemu się tak kompiluje?

Witam

Poniżej fragment z listingu kompilatora (uC==ATMega8):

byte SPI_TRX(char cData=0) { SPDR = cData; // Start transmission 104: 8f b9 out 0x0f, r24 ; 15 while (!(SPSR & (1<<SPIF))); // Wait for transmission complete 106: 77 9b sbis 0x0e, 7 ; 14 108: fe cf rjmp .-4 ; 0x106 <_Z7SPI_TRXc+0x2>

return SPDR; 10a: 8f b1 in r24, 0x0f ; 15 } 10c: 99 27 eor r25, r25 10e: 08 95 ret

00000110 <_Z7RS_znakh>:

void RS_znak(byte data) { 110: 48 2f mov r20, r24 112: 21 e0 ldi r18, 0x01 ; 1 114: 30 e0 ldi r19, 0x00 ; 0 while (!(UCSRA&(1<<UDRE))); // Wait for empty transmit buffer 116: 8b b1 in r24, 0x0b ; 11 118: 99 27 eor r25, r25 11a: 55 e0 ldi r21, 0x05 ; 5 11c: 96 95 lsr r25 11e: 87 95 ror r24 120: 5a 95 dec r21 122: e1 f7 brne .-8 ; 0x11c <_Z7RS_znakh+0xc>

124: 82 27 eor r24, r18 126: 93 27 eor r25, r19 128: 80 fd sbrc r24, 0 12a: f5 cf rjmp .-22 ; 0x116 <_Z7RS_znakh+0x6>

UDR=data; // Put data into buffer, sends the data 12c: 4c b9 out 0x0c, r20 ; 12 12e: 08 95 ret

Czy ktoś mi może wytłumaczyć, dlaczego pierwsza funkcja kompiluje się normalnie, a druga do testowania jednego bitu robi takie kombinacje?

Jak już kiedyś wspominałem, robię na pracę magisterską generator DDS -

formatting link
. Choć urządzenie już prawie gotowe (kończę oprogramowanie), może macie jakieś uwagi? :)

Reply to
Sawik
Loading thread data ...

Mi skompilowalo sie normalnie:

while (!(UCSRA&(1<<UDRE))); 5002: 5d 9b sbis 0x0b, 5 ; 11 5004: fe cf rjmp .-4 ; 0x5002 <main+0x17c>

U Ciebie potraktowało to jako liczby 16-bitowe. Albo 1 jest 16 - bitowa albo UCSRA. Ale dlaczego nie wiem.

Reply to
Bogdan G

Sawik przemówił ludzkim głosem:

[...]

Jest to prawdopodobnie związane z błędnym obliczaniem kosztu operacji podczas optymalizacji kodu przez gcc. Więcej informacji znajdziesz tutaj:

formatting link

Reply to
Zbych

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.