// // Illustrate allocating some unused registers as local variables of function // // // /* -------------------------------------------------- Define required labels for EGTAPI -------------------------------------------------- */ .global main, Stop, CodeEnd, DataStart, DataEnd .global Pause, sumRange /* -------------------------------------------------- Begin of the program instructions -------------------------------------------------- */ .text main: // sum = sumRange(A, x, y) // pass A in r0 movw r0, #:lower16:A movt r0, #:upper16:A // pass x in r1 movw r1, #:lower16:x movt r1, #:upper16:x ldr r1, [r1] // pass y in r2 movw r2, #:lower16:y movt r2, #:upper16:y ldr r2, [r2] bl sumRange movw r1, #:lower16:sum movt r1, #:upper16:sum str r0, [r1] Pause: // sum = sumRange(B, 3, 7) movw r0, #:lower16:B movt r0, #:upper16:B mov r1, #3 mov r2, #7 bl sumRange movw r1, #:lower16:sum movt r1, #:upper16:sum str r0, [r1] Stop: nop // Stop point of main( ) sumRange: // A=r0, a=r1, b=r2, i=r3, s=r4 mov r4, #0 // s = 0 mov r3, r1 // i = a while: cmp r3, r2 bge whileEnd add r5, r3, r3 // r5 = 2*i add r5, r5, r5 // r5 = 4*i ldr r5, [r0, r5] // r5 = A[i] add r4, r4, r5 // s = s + A[i] add r3, r3, #1 // i++ b while whileEnd: // return(s) mov r0, r4 mov pc, lr CodeEnd: nop /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data DataStart: A: .4byte 11, 12, 13, 14, 15, 16, 17, 18, 19 , 20 B: .4byte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 x: .4byte 1 y: .4byte 3 sum: .4byte -1 DataEnd: .end