	.file	"fac.c"
gcc2_compiled.:
	.section	".rodata"
	.align 2
.LC0:
	.string	"10! = %d\n"
	.section ".text"
	.align 2
	.globl main
	.type	 main,@function
main:
	stwu %r1,-16(%r1)	# 16 Byte auf dem Stack "reservieren"
	mflr %r0		# Ruecksprungadresse zum Hauptprogramm
				# in r0 ablegen
	stw %r0,20(%r1)		# Ruecksprungadresse in den Stack schreiben
	li %r3,10		# Wert 10 als Uebergabeparameter in r3
	bl fac			# und fac(10) aufrufen.
	b .END			# Programmende:	 Ausgabe + aufraeumen
	
fac:				# Beginn der rekursiven fac-Definition
				# (r1 verweist auf den Stack)
	
	stwu %r1,-12(%r1)	# An der Adresse r1-12 wird der Inhalt
				# des Registers r1 gespeichert und
				# anschliessend r1:=r1-12
				# (Berechnung des neuen Stackpointers)
	mflr %r0		# Der Inhalt des Linkregisters (Ruecksprung-
				# adresse) wird in r0 gespeichert, um ihn
				# auf den Stack schreiben zu koennen.
	stw %r0,16(%r1)		# Ruecksprungadresse des aktuellen Aufrufs
				# an die Adresse r1+16 schreiben
				# (bzw.UrspruenglicherStackpointer + 4)
	stw %r3,8(%r1)		# Aufrufparameter in Stack+8 speichern
	cmpwi %cr1,%r3,1	# Vergleich Aufrufparameter mit Wert 1
				# (Prueft auf Rekursionsende)
	bc 4,6,.L2f		# Zu .L2f (Rek. Aufruf notwendig) springen,
				# falls Aufrufparameter != 1 gilt
	b .L1f			# Ende der Rekursion -> Aufraeumen
.L2f:
	addi %r3,%r3,-1		# dekrementierten Aufrufwert in r3 schreiben
				# (in r3 wird der Parameter fuer den folgenden
				# Aufruf verlangt)
	bl fac			# Rekursiver Aufruf (also mit Wert "n-1")
	lwz %r9,8(%r1)		# Der "alte" Parameter wird nach r9
				# geladen (entspricht dem "n")
	mullw %r3,%r3,%r9	# und mit dem Ergebnis des vorherigen Aufrufs
				# multipliziert (steht in r3). Das Ergebnis
				# des Funktionsaufrufs wird ebenfalls in
				# r3 erwartet, so dass es dorthin geschrieben
				# wird. (Berechnet den Wert von (n*fac(n-1)))
.L1f:
	lwz %r1,0(%r1)		# den alten Wert des Stackpointers
				# (vor Aufruf) in r1 laden
				# (Restauration des Stacks)
	lwz %r0,4(%r1)		# Ruecksprungsadresse in r0 laden
	mtlr %r0		# ... und Ruecksprungadresse in LR kopieren
        blr			# Ende der rekursiven fac Funktion
				# (Sprung zur Ruecksprungadresse)
.END:	
				# Ausgeben und aufraeumen ...
				# (nicht weiter kommentiert oder vereinfacht)
	mr %r0,%r3		
	addis %r9,0,k@ha
	addi %r11,%r9,k@l
	stw %r0,0(%r11)
	addis %r11,0,k@ha
	addi %r9,%r11,k@l
	addis %r11,0,.LC0@ha
	addi %r3,%r11,.LC0@l
	lwz %r4,0(%r9)
	crxor 6,6,6
	bl printf
.L4:
	lwz %r11,0(%r1)
	lwz %r0,4(%r11)
	mtlr %r0
	mr %r1,%r11
	blr
.Lfe2:
	.size	 main,.Lfe2-main
	.comm	k,4,4
	.ident	"GCC: (GNU) 2.8.1"





