Hallo,

ich habe eine Funktion add(char,char), die mir die Summe der beiden Werte liefert. Nun hat GCC 3.4.6 mit der Optimierung 2,3,s folgendes draus gemacht:
Code:
  35               	.global	_Z3addcc
  37               	_Z3addcc:
  38               	.LFB42:
  39               	.LM1:
  40               	/* prologue: frame size=0 */
  41               	/* prologue end (size=0) */
  42 0000 962F      		mov r25,r22
  43               	.LBB2:
  44               	.LM2:
  45 0002 980F      		add r25,r24
  46               	.LBE2:
  47               	.LM3:
  48 0004 892F      		mov r24,r25
  49 0006 9927      		clr r25
  50               	/* epilogue: frame size=0 */
  51 0008 0895      		ret
Es kommt aber noch dicker, Code bei Optimierung 0:
Code:
32               	.global	_Z3addcc
  34               	_Z3addcc:
  35               	.LFB42:
  36               	.LM1:
  37               	/* prologue: frame size=2 */
  38 0000 CF93      		push r28
  39 0002 DF93      		push r29
  40 0004 CDB7      		in r28,__SP_L__
  41 0006 DEB7      		in r29,__SP_H__
  42 0008 2297      		sbiw r28,2
  43 000a 0FB6      		in __tmp_reg__,__SREG__
  44 000c F894      		cli
  45 000e DEBF      		out __SP_H__,r29
  46 0010 0FBE      		out __SREG__,__tmp_reg__
  47 0012 CDBF      		out __SP_L__,r28
  48               	/* prologue end (size=10) */
  49 0014 8983      		std Y+1,r24
  50 0016 6A83      		std Y+2,r22
  51               	.LBB2:
  52               	.LM2:
  53 0018 9981      		ldd r25,Y+1
  54 001a 8A81      		ldd r24,Y+2
  55 001c 890F      		add r24,r25
  56 001e 9927      		clr r25
  57               	.LBE2:
  58               	/* epilogue: frame size=2 */
  59 0020 2296      		adiw r28,2
  60 0022 0FB6      		in __tmp_reg__,__SREG__
  61 0024 F894      		cli
  62 0026 DEBF      		out __SP_H__,r29
  63 0028 0FBE      		out __SREG__,__tmp_reg__
  64 002a CDBF      		out __SP_L__,r28
  65 002c DF91      		pop r29
  66 002e CF91      		pop r28
  67 0030 0895      		ret
Bei der Optimerung 1 kommt jedoch das hier raus:
Code:
  32               	.global	_Z3addcc
  34               	_Z3addcc:
  35               	.LFB42:
  36               	.LM1:
  37               	/* prologue: frame size=0 */
  38               	/* prologue end (size=0) */
  39               	.LBB2:
  40               	.LM2:
  41 0000 860F      		add r24,r22
  42               	.LBE2:
  43               	.LM3:
  44 0002 9927      		clr r25
  45               	/* epilogue: frame size=0 */
  46 0004 0895      		ret
Kann mir jemand erklären, wieso GCC bei Opt. 0,2,3,s solch einen Mist produziert? Besonders bei Opt. 0, wo er anscheinend aus dem Hw-Stack einen Sw-Stack macht ???

MfG Mark