Hi,
mein avr-gcc hat mit unter Ubuntu 13.04 mit -O2 folgendes produziert:
1 |
|
2 |
|
3 | void bar(void)
|
4 | {
|
5 | if( foo() == 1 )
|
6 | 94: 0e 94 53 00 call 0xa6 ; 0xa6 <foo>
|
7 | 98: 01 97 sbiw r24, 0x01 ; 1
|
8 | 9a: 11 f0 breq .+4 ; 0xa0 <bar+0xc>
|
9 | return 1;
|
10 | uint8_t a = foo();
|
11 | 9c: 0c 94 53 00 jmp 0xa6 ; 0xa6 <foo>
|
12 | a0: 08 95 ret
|
13 |
|
14 | 000000a2 <main>:
|
15 | return 2;
|
16 | }
|
17 |
|
18 | void main(void)
|
19 | {
|
20 | bar();
|
21 | a2: 0c 94 4a 00 jmp 0x94 ; 0x94 <bar>
|
22 |
|
23 | 000000a6 <foo>:
|
24 | #include <stdint.h>
|
25 | uint8_t foo(void)
|
26 | {
|
27 | return 1;
|
28 | }
|
29 | a6: 81 e0 ldi r24, 0x01 ; 1
|
30 | a8: 08 95 ret
|
Wie zu sehen ist, gibt foo() einen 8-Bit grossen Wert in r24 zurueck.
Danach testet der Compiler das Ergebnis mit sbiw, welched r24:r25
anschaut. Das ganze hat mir in einem komplexeren Programm schon Probleme
bereitet. Wenn ich die if-Abfrage durch
1 | uint8_t baz=foo(); if( baz == 1 ) {...}
|
ersetzte, wird cpi zum Vergleichen genommen und das Ergebnis ist wie
erwartet.
Bug im Compiler oder nur mein Tunnelblick?
Gruss,
Tobias