	.equ	INPUT_VALUE,	5
	@ Embest board specific software interrupts
	.equ	SWI_PrInt,	0x6b
	.equ	Stdout,		0x01
	.equ	SWI_Exit,	0x11

	.text
factorial:
	@ Push stack
	stmfd	sp!, {r4, lr}
	@ Store n in local variable
	mov	r4, r0
	@ branch if n > 1
	cmp	r4, #1
	bgt	factorial_recurse
	@ return 1
	mov	r0, #1
	bal	factorial_end
factorial_recurse:
	@ calculate factorial(n-1)
	mov	r0, r4
	sub	r0, r0, #1
	bl	factorial
	@ multiply returned value by n
	mul	r0, r4, r0
	@ now returns n * factorial(n-1)
factorial_end:
	ldmfd	sp!, {r4, lr}
	bx	lr

	.global _start
_start:
	stmfd	sp!, {lr}
	mov	r0, #INPUT_VALUE
	bl	factorial

	@ print to stdout
	mov	r1, r0
	mov	r0, #Stdout
	swi	SWI_PrInt

	ldmfd	sp!, {lr}
@	bx	lr
	swi	SWI_Exit