We can re-write a for-statement into an equivalent while-statement as follows:
for ( expr1; condition; expr2 ) statement(s); |
is equivalent to:
expr1; while ( condition ) { statement(s); expr2; } |
We (1) first re-write a for-statement into a while-statement and then (2) construct the program flow and (3) translate into ARM assembler code
Loop to find the sum of an array:
int A[10]; int sum, i; sum = 0; for (i = 0; i < 10; i++); sum = sum + A[i]; |
As before, I will omit discussing the variable definitions !
(I showed you the variable definitions to give you their data type information !)
For-loop:
sum = 0; for (i = 0; i < 10; i++); sum = sum + A[i]; |
For-loop:
sum = 0; for (i = 0; i < 10; i++); sum = sum + A[i]; |
First, re-write the for-loop into a while-loop:
sum = 0; i = 0; while ( i < 10 ) { sum = sum + A[i]; i++; } |
sum = 0; i = 0; while ( i < 10 ) { sum = sum + A[i]; i++; } |
Next, construct the program flow diagram:
Finally: Code the program flow using cmp + conditional branch instructions
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 // (not necessary, because r0 is already = 0...) 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: /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data A: .4byte 4, 6, 7, 3, 8, 2, 9, 1, 5, 10 // int array (with 10 values) sum: .skip 4 i: .skip 4 .end |
DEMO: /home/cs255001/demo/asm/7-while/for-sum-array.s