@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @ 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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@