/* -------------------------------------------------- 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) ====================================== */ movw r0, #:lower16:y movt r0, #:upper16:y ldr r0, [r0] push {r0} movw r0, #:lower16:x movt r0, #:upper16:x ldr r0, [r0] push {r0} movw r0, #:lower16:A movt r0, #:upper16:A push {r0} bl sumRange add sp, sp, #12 movw r1, #:lower16:sum movt r1, #:upper16:sum str r0, [r1] Pause: /* ====================================== sum = sumRange(B, 3, 7) ====================================== */ mov r0, #7 push {r0} mov r0, #3 push {r0} movw r0, #:lower16:B movt r0, #:upper16: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( ) // Stack frame structure used: // // i offset = -8 // s offset = -4 // FP--> saved FP (offset=0) // saved LR (return address) (offset=4) // A offset = +8 // a offset = +12 // b offset = +16 // // Store return value in r0 sumRange: push {lr} push {fp} mov fp, sp sub sp, sp, #8 // ============================================ // s = 0 mov r0, #0 str r0, [fp,#-4] // i = a ldr r0, [fp,#12] str r0, [fp,#-8] while: ldr r0, [fp,#-8] ldr r1, [fp,#16] cmp r0, r1 bge whileEnd // s = s + A[i] ldr r0, [fp,#-4] ldr r1, [fp,#8] // A ldr r2, [fp,#-8] // i add r2, r2, r2 add r2, r2, r2 ldr r1, [r1,r2] add r0, r1, r0 str r0, [fp, #-4] // i++ ldr r0, [fp,#-8] add r0, r0, #1 str r0, [fp,#-8] b while whileEnd: ldr r0,[fp,#-4] return: mov sp, fp pop {fp} pop {pc} // <----------- BUG 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