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