/* -------------------------------------------------- Define required labels for EGTAPI -------------------------------------------------- */ .global main, Stop, CodeEnd, DataStart, DataEnd .global A, sum, i .global while // Let me stop at the start of while loop /* -------------------------------------------------- sum = 0; i = 0; while ( i < 10 ) { sum = sum + A[i]; i = i + 1; } -------------------------------------------------- */ .text main: // sum = 0; - always execute the RHS first !!! mov r0, #0 // r0 = 0 - ready to save it movw r1, #:lower16:sum movt r1, #:upper16:sum // r1 = addr(sum) str r0, [r1] // sum = 0; // i = 0; mov r0, #0 // r0 = 0 - ready to save it movw r1, #:lower16:i movt r1, #:upper16:i // r1 = addr(i) str r0, [r1] // i = 0; while: // START of while loop // Test while condition i < 10 movw r0, #:lower16:i movt r0, #:upper16:i // r0 = addr(i) ldr r1, [r0] // r1 = i; cmp r1, #10 // Check: i < 10 bge whileEnd // If i >= 10: exit while loop /* *********************************** While body *********************************** */ // sum = sum + A[i] //// Get sum movw r0, #:lower16:sum movt r0, #:upper16:sum // r0 = addr(sum) ldr r2, [r0] // r2 = sum; //// Get A[i] (use base + offset access technique !) movw r0, #:lower16:A movt r0, #:upper16:A // r0 = addr(sum) --- Base address movw r1, #:lower16:i movt r1, #:upper16:i // r1 = addr(i) ldr r1, [r1] // r1 = i --- index add r1, r1, r1 // r1 = 2*i add r1, r1, r1 // r1 = 4*i --- Offset ! ldr r3, [r0,r1] // r3 = A[i] //// compute sum + A[i] add r2, r2, r3 // r2 = sum + A[i] //// Store result in sum (in memory) movw r0, #:lower16:sum movt r0, #:upper16:sum // r0 = addr(sum) str r2, [r0] // sum = sum + A[i] // i = i + 1 movw r0, #:lower16:i movt r0, #:upper16:i // r0 = addr(i) ldr r2, [r0] // r2 = i; add r2, r2, #1 // r2 = i + 1 str r2, [r0] // i = i + 1; // End of while body --- branch back to test !! b while whileEnd: Stop: CodeEnd: nop /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data DataStart: A: .4byte 4, 6, 7, 3, 8, 2, 9, 1, 5, 10 sum: .skip 4 i: .skip 4 DataEnd: .end