Hallo Forum, Testcode:
1 | extern uint8_t x; |
2 | extern void bar(const uint8_t *cmd); |
3 | |
4 | void foo(void) { |
5 | uint8_t cmd[6]; |
6 | cmd[0] = x; |
7 | cmd[1] = 0x00; |
8 | cmd[2] = 0x00; |
9 | cmd[3] = 0x00; |
10 | cmd[4] = 0x00; |
11 | cmd[5] = 0xFF; |
12 | bar(cmd); |
13 | }
|
wird mit avr-gcc -s -Os -mmcu=avr6
1 | foo:
|
2 | push r28 |
3 | push r29 |
4 | rcall . // ! |
5 | rcall . // ! |
6 | in r28,__SP_L__ |
7 | in r29,__SP_H__ |
8 | /* prologue: function */
|
9 | /* frame size = 6 */
|
10 | /* stack size = 8 */
|
11 | .L__stack_usage = 8 |
12 | lds r24,x |
13 | std Y+1,r24 |
14 | std Y+2,__zero_reg__ |
15 | std Y+3,__zero_reg__ |
16 | std Y+4,__zero_reg__ |
17 | std Y+5,__zero_reg__ |
18 | ldi r24,lo8(-1) |
19 | std Y+6,r24 |
20 | movw r24,r28 |
21 | adiw r24,1 |
22 | call bar |
23 | /* epilogue start */
|
24 | adiw r28,6 |
25 | in __tmp_reg__,__SREG__ |
26 | cli
|
27 | out __SP_H__,r29 |
28 | out __SREG__,__tmp_reg__ |
29 | out __SP_L__,r28 |
30 | pop r29 |
31 | pop r28 |
32 | ret
|
33 | .ident "GCC: (GNU) 5.3.1 20160106" |
Wie man sieht werden im Prolog der Funktion 2x RCALL . erzeugt. Ich kann mir das nicht erklären. mit freundlichen Grüßen und frohe Weihnachten, N.G.