Hallo Sprinter.

Danke für die ausfürliche Antwort.

Zu deinem Bsp.
Wieso muss GCC diese sichern? Das ganze geht ja auch ohne das sichern. Es geht doch auch add R22,R22 ?

Ich habe mal ein Beispiel, bei dem der GCC (für mich) unverständlich viel Pushed.
Code:
long foo(long a, long b, long c, uint8_t d){
  if(d){
    return a+b;
  }else{
    return a-c;
  }
}
Nun das Listing:
Code:
long foo(long a, long b, long c, uint8_t d){
  4e:	cf 92       	push	r12 ;Alle unteren Register werden gepushed
  50:	ef 92       	push	r14 ;obwohl sie nicht verändert werden
  52:	ff 92       	push	r15 ;
  54:	0f 93       	push	r16
  56:	1f 93       	push	r17
  if(d){
  58:	cc 20       	and	r12, r12
  5a:	29 f0       	breq	.+10     	; 0x66 <foo+0x18>
    return a+b;
  5c:	62 0f       	add	r22, r18
  5e:	73 1f       	adc	r23, r19
  60:	84 1f       	adc	r24, r20
  62:	95 1f       	adc	r25, r21
  64:	04 c0       	rjmp	.+8      	; 0x6e <foo+0x20>
  }else{
    return a-c;
  66:	6e 19       	sub	r22, r14
  68:	7f 09       	sbc	r23, r15
  6a:	80 0b       	sbc	r24, r16
  6c:	91 0b       	sbc	r25, r17
  6e:	1f 91       	pop	r17 ;und wieder restaurieren, obwohl sie 
  70:	0f 91       	pop	r16 ;unberührt sind...
  72:	ff 90       	pop	r15
  74:	ef 90       	pop	r14
  76:	cf 90       	pop	r12
  78:	08 95       	ret
GCC ist jedoch, obwohl er diese Eigenheit hat. einer der besten Compiler. Recursive funktionen macht er z.T. auch ohne Pushen. Sofern halt wieder die unteren Register nicht berührt werden.

Mir ist bewust, dass GCC die unteren Register nur zum Teil verwenden kann. Das ist doch aber kein Grund, diese zu Pushen, obwohl die nicht verändert werden. Kann man das dem GCC irgendwie abgewöhnen?

Grüße