# Recursive programming in ARMV8 assembly assignment help

The assignment deals with calculating the power of a number to a given exponent using a recursive function written in 64bit ARM assembly. The program reads the two values to use from the user and calls the recursive function to calculate the power. The local variables and registers used in the function are saved in the stack. The following is a quick demonstration of recursive programming done by our ARM assignment help providers.
```.section .data input_x_prompt : .asciz "Please enter x: " input_y_prompt : .asciz "Please enter y: " input_spec : .asciz "%d" result : .asciz "x^y = %d\n" .section .text .balign 4 .global main main: // add code and other labels here stp fp, lr, [sp, -16]! // save frame pointer and lr in stack mov fp, sp // create new stack frame sub sp, sp, -16 // allocate space in stack for local variables ldr x0, =input_x_prompt // print x prompt bl printf ldr x0, =input_spec // load format to read integer mov x1, sp // save read value in stack bl scanf // read integer from user ldr x0, =input_y_prompt // print y prompt bl printf ldr x0, =input_spec // load format to read integer add x1, sp, 8 // save read value in stack bl scanf // read integer from user ldr w0, [sp] // load x value in x0 sxtw x0, w0 // extend word to doubleword ldr w1, [sp, 8] // load y value in x1 sxtw x1, w1 // extend word to doubleword bl power // calculate power(x, y) ldr x0, =result // load format to print result mov x1, x2 // load result for printing it bl printf // print result mov sp, fp // remove variables from stack ldp fp, lr, [sp], 16 // restore frame pointer and lr from stack // branch to this label on program completion exit: mov x0, 0 mov x8, 93 svc 0 ret // power function // power(x,y) // Calculates x^y // On entry: x0 = x, x1 = y // Returns x2 = x^y power: stp fp, lr, [sp, -16]! // save frame pointer and lr in stack mov fp, sp // create new stack frame str x19, [sp, -16]! // push x19 on stack adds x2, x0, x1 // test if both x and y are 0 beq return1 // if so, return 1 cmp x0, 0 // if x == 0 beq return0 // return 0 cmp x1, 0 // if y < 0 bge else1 return0: mov x2, 0 // return 0 b powerEnd else1: cmp x1, 0 // if y == 0 bne else2 return1: mov x2, 1 // return 1 b powerEnd else2: mov x19, x0 // save x in x19 sub x1, x1, 1 // calculate y - 1 bl power // recurse power(x, y - 1) mul x2, x2, x19 // multiply x * power(x, y - 1) powerEnd: ldr x19, [sp], 16 // pop x19 from stack ldp fp, lr, [sp], 16 // restore frame pointer and lr from stack ret ```