@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 
@ This program prints the factorials of 
@ numbers 3, 4, 5, 6, in hexadecimal.
@
@ It defines and uses recursive function factorial,
@ as well as functions print_digit and print_number.
@ 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ Program part 1: definition of main.
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.globl _start
_start:
	mov sp, #0x100000		@initialize sp at start of program

	@ program main body 
	ldr r4,=0x101f1000	
	@ ASCII codes stored at [r4] get printed		

	mov r6, #3
my_loop:
	cmp r6, #6
	bgt my_exit

	mov r0, r6
	bl factorial
	bl print_number
	add r5, r5, #1
	add r6, r6, #1
	b my_loop

my_exit: 			@ print "END" on a new line
	mov r1, #'\r'
	str r1, [r4]		
	mov r1, #'\n'		
	str r1, [r4]		
	mov r1, #'E'		
	str r1, [r4]		
	mov r1, #'N'		
	str r1, [r4]		
	mov r1, #'D'		
	str r1, [r4]

the_end:			@ do infinite loop at the end
	b the_end	

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ Program part 2: definition of functions.
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

factorial:
	@ factorial preamble
	sub sp, sp, #12
	str lr, [sp, #0]
	str r4, [sp, #4]
	str r5, [sp, #8]

	@ factorial main body
	mov r4, r0
	cmp r4, #0
	moveq r0, #1
	beq factorial_exit

	sub r0, r4, #1
	bl factorial
	mov r5, r0
	mul r0, r5, r4

factorial_exit:	
	@ factorial wrap-up
	ldr lr, [sp, #0]
	ldr r4, [sp, #4]
	ldr r5, [sp, #8]
	add sp, sp, #12
	bx lr

	
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	
print_digit:	
	@ print_digit preamble
	sub sp, sp, #12
	str lr, [sp, #0]
	str r4, [sp, #4]
	str r5, [sp, #8]

	@ print_digit main body
	ldr r4,=0x101f1000	
	@ ASCII codes stored 
	@ at [r4] get printed
	
	cmp r0, #10
	addlt r5, r0, #48
	addge r5, r0, #55
	str r5, [r4]

	@ print_digit wrap-up
	ldr lr, [sp, #0]
	ldr r4, [sp, #4]
	ldr r5, [sp, #8]
	add sp, sp, #12
	bx lr

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	
print_number:	
	@ print_number preamble
	sub sp, sp, #24
	str lr, [sp, #0]
	str r0, [sp, #4]
	str r4, [sp, #8]
	str r5, [sp, #12]
	str r6, [sp, #16]
	str r7, [sp, #20]

	@ print_number main body
	ldr r4,=0x101f1000	
	@ ASCII codes stored 
	@ at [r4] get printed

	mov r5, #28
	mov r6, r0
	
print_number_loop:	
	cmp r5, #0
	blt print_number_exit

	lsr r7, r6, r5
	and r7, r7, #0x0000000f

	mov r0, r7
	bl print_digit

	sub r5, r5, #4
	b print_number_loop

print_number_exit:
	@ print newline
	mov r5, #13
	str r5, [r4]		
	mov r5, #10		
	str r5, [r4]		

	@ print_number wrap-up
	ldr lr, [sp, #0]
	ldr r0, [sp, #4]
	ldr r4, [sp, #8]
	ldr r5, [sp, #12]
	ldr r6, [sp, #16]
	ldr r7, [sp, #20]

	sub sp, sp, #24
	bx lr

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	


