Write comments for following Aarch64 assembly language program. Following is what this program does (a) Create an array of 10 random integers in the range [10..99]. Duplicates are permitted. (b) Print the array to standard output. (c) Sort the array using the insertion sort algorithm. (d) Print the sorted array to standard output. Here is code:
.section .data
.prompt1: .asciz "The random array is: "
.prompt2: .asciz "The sorted array is: "
.printint: .asciz "%d "
.printnl: .asciz "\n"
 
.section .bss
array: .skip 40
 
.section .text
.global main
.type main, @function
 
main:
 
sub sp, sp, #32
stp x29, x30, [sp, #16]
add x29, sp, #16
stur wzr, [x29, #-4]
str wzr, [sp, #8]
 
mov x0, 0
bl	time
bl  srand
 
.randloop:
ldr w8, [sp, #8]
subs w8, w8, #10
bge .endrandloop
bl rand
ldrsw x9, [sp, #8]
adrp x8, array
add x8, x8, :lo12:array
 
mov	w3, 90
udiv w1, w0, w3
mul w1, w1, w3
sub w0, w0, w1
add w0, w0, #10
 
str w0, [x8, x9, lsl #2]
ldr w8, [sp, #8]
add w8, w8, #1
str w8, [sp, #8]
b .randloop
 
.endrandloop:
adrp x0, .prompt1
add x0, x0, :lo12:.prompt1
bl printf
str wzr, [sp, #4]
 
.printloop:
ldr w8, [sp, #4]
subs w8, w8, #10
bge .endprintloop
ldrsw x9, [sp, #4]
adrp x8, array
add x8, x8, :lo12:array
ldr w1, [x8, x9, lsl #2]
adrp x0, .printint
add x0, x0, :lo12:.printint
bl printf
ldr w8, [sp, #4]
add w8, w8, #1
str w8, [sp, #4]
b .printloop
 
.endprintloop:
adrp x0, .printnl
add x0, x0, :lo12:.printnl
bl printf
 
mov w8, #1
str w8, [sp, #16]
 
.outerinsertionsort:
ldr w8, [sp, #16]
subs w8, w8, #10
bge .endouterinsertionsort
ldrsw x9, [sp, #16]
adrp x8, array
add x8, x8, :lo12:array
ldr w8, [x8, x9, lsl #2]
str w8, [sp, #12]
ldr w8, [sp, #16]
subs w8, w8, #1
str w8, [sp, #8]
 
.innerinsertionsortcondition:
ldr w8, [sp, #8]
mov w9, #0
str w9, [sp]
tbnz w8, #31, .innerinsertionsortbody
ldrsw x9, [sp, #8]
adrp x8, array
add x8, x8, :lo12:array
ldr w8, [x8, x9, lsl #2]
ldr w9, [sp, #12]
subs w8, w8, w9
cset w8, gt
str w8, [sp]
 
.innerinsertionsortbody:
ldr w8, [sp]
tbz w8, #0, .endinnerinsertionsortcondition
ldrsw x8, [sp, #8]
adrp x9, array
add x9, x9, :lo12:array
ldr w8, [x9, x8, lsl #2]
ldr w10, [sp, #8]
add w10, w10, #1
str w8, [x9, w10, sxtw #2]
ldr w8, [sp, #8]
subs w8, w8, #1
str w8, [sp, #8]
b .innerinsertionsortcondition
 
.endinnerinsertionsortcondition:
ldr w8, [sp, #12]
ldr w9, [sp, #8]
add w10, w9, #1
adrp x9, array
add x9, x9, :lo12:array
str w8, [x9,w10, sxtw #2]
ldr w8, [sp, #16]
add w8, w8, #1
str w8, [sp, #16]
b .outerinsertionsort
 
.endouterinsertionsort:
adrp x0, .prompt2
add x0, x0, :lo12:.prompt2
bl printf
str wzr, [sp, #4]
 
.printloop2:
ldr w8, [sp, #4]
subs w8, w8, #10
bge .endprintloop2
ldursw x9, [sp, #4]
adrp x8, array
add x8, x8, :lo12:array
ldr w1, [x8, x9, lsl #2]
adrp x0, .printint
add x0, x0, :lo12:.printint
bl printf
ldr w8, [sp, #4]
add w8, w8, #1
str w8, [sp, #4]
b .printloop2
 
.endprintloop2:
adrp x0, .printnl
add x0, x0, :lo12:.printnl
bl printf
 
mov w0, wzr
ldp x29, x30, [sp, #16]
add sp, sp, #32
ret