//---------------------------------------------------------------------- // powerunsigned.s // Author: Bob Dondero and William Ughetta //---------------------------------------------------------------------- .section .rodata basePromptStr: .string "Enter the base: " expPromptStr: .string "Enter the exponent: " scanfFormatStr: .string "%lu" printfFormatStr: .string "%lu to the %lu power is %lu.\n" //---------------------------------------------------------------------- .section .data ulPower: .quad 1 //---------------------------------------------------------------------- .section .bss ulBase: .skip 8 ulExp: .skip 8 ulIndex: .skip 8 //---------------------------------------------------------------------- .section .text //-------------------------------------------------------------- // Read a non-negative base and exponent from stdin. Write // base raised to the exponent power to stdout. Return 0. // int main(void) //-------------------------------------------------------------- // Must be a multiple of 16 .equ MAIN_STACK_BYTECOUNT, 16 .global main main: // Prolog sub sp, sp, MAIN_STACK_BYTECOUNT str x30, [sp] // printf("Enter the base: ") adr x0, basePromptStr bl printf // scanf("%d", &ulBase) adr x0, scanfFormatStr adr x1, ulBase bl scanf // printf("Enter the exponent: ") adr x0, expPromptStr bl printf // scanf("%d", &ulExp) adr x0, scanfFormatStr adr x1, ulExp bl scanf // ulIndex = 1 mov x0, 1 adr x1, ulIndex str x0, [x1] powerLoop: // if (ulIndex > ulExp) goto powerLoopEnd adr x0, ulIndex ldr x0, [x0] adr x1, ulExp ldr x1, [x1] cmp x0, x1 bhi powerLoopEnd // ulPower *= ulBase adr x0, ulPower ldr x1, [x0] adr x2, ulBase ldr x2, [x2] mul x1, x1, x2 str x1, [x0] // ulIndex++ adr x0, ulIndex ldr x1, [x0] add x1, x1, 1 str x1, [x0] // goto powerLoop b powerLoop powerLoopEnd: // printf("%ld to the %ld power is %ld.\n",ulBase,ulExp,ulPower) adr x0, printfFormatStr adr x1, ulBase ldr x1, [x1] adr x2, ulExp ldr x2, [x2] adr x3, ulPower ldr x3, [x3] bl printf // Epilog and return 0 mov w0, 0 ldr x30, [sp] add sp, sp, MAIN_STACK_BYTECOUNT ret .size main, (. - main)