// // Program file used to demo writing the function "sumRange" // /* -------------------------------------------------- Define required labels for EGTAPI -------------------------------------------------- */ .global main, Stop, CodeEnd, DataStart, DataEnd .global Pause, sumRange /* -------------------------------------------------- Begin of the program instructions -------------------------------------------------- */ .text main: // sum = sumRange(A, a, b): // pass b movw r0, #:lower16:b movt r0, #:upper16:b ldr r0, [r0] push {r0} // pass a movw r0, #:lower16:a movt r0, #:upper16:a ldr r0, [r0] push {r0} // pass A movw r0, #:lower16:A movt r0, #:upper16:A // r0 = base of array A push {r0} bl sumRange add sp, sp, #12 movw r1, #:lower16:sum movt r1, #:upper16:sum str r0, [r1] Pause: // sum = sumRange(B, 2, 4): // pass 4 mov r0, #4 push {r0} // pass 2 mov r0, #2 push {r0} // pass B movw r0, #:lower16:B movt r0, #:upper16:B // r0 = base of array B push {r0} bl sumRange add sp, sp, #12 movw r1, #:lower16:sum movt r1, #:upper16:sum str r0, [r1] Stop: nop // Stop point of main( ) sumRange: // sumRange(A, a, b): // return value is in register r0 // Prelude push {lr} push {fp} mov fp, sp sub sp, sp, #8 // body mov r0, #0 str r0, [fp,#-4] // s = 0 ldr r0, [fp, #12] str r0, [fp, #-8] // i = a while: // while (i < b) //// Get i into r0 ldr r0, [fp, #-8] // offset(local var i) = -8 from FP //// Get b into r1 ldr r1, [fp, #16] // offset(b) = 16 from FP //// Check for (i < b) cmp r0, r1 // r0 = i, r1 = b bge whileEnd // Exit while loop if FALSE // s = s + A[i]; ///// get A[i] into r10 ldr r0, [fp, #8] // r0 = addr of array A ldr r1, [fp, #-8] // r1 = i add r1, r1, r1 // r1 = 2*i add r1, r1, r1 // r1 = 4*i = offset used to access A[i] ldr r10, [r0, r1] // r10 = A[i] (r0=A(base), r1=offset) ///// get s into r0 ldr r0, [fp, #-4] // r0 = s ///// compute s + A[i] add r0, r0, r10 // r0 = s + A[i] ///// Save sum in memory variable s str r0, [fp, #-4] // s = s + A[i] // i++ ldr r0, [fp, #-8] // r0 = i add r0, r0, #1 // r0 = i+1 str r0, [fp, #-8] // i = i+1 b while // End of while body - loop back !! whileEnd: // return(s) //// Put the return value in the agreed register (r0) ldr r0, [fp, #-4] // r0=s /* ============================================================= Function Postlude: de-allocate local variable and restore FP ============================================================= */ mov sp, fp // De-allocate local variables pop {fp} // Restore fp pop {pc} // Return to the caller // postlude mov sp, fp pop {fp} pop {pc} 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 a: .4byte 1 b: .4byte 3 sum: .skip 4 DataEnd: .end