The for-statement and while-statement

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

Example of translation a for-statement
 

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 !)

Example of translation a for-statement
 

For-loop:

    sum = 0;

    for (i = 0; i < 10; i++);                
        sum = sum + A[i]; 

Example of translation a for-statement
 

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++;
    } 

Example of translation a for-statement

    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

Example of translation a for-statement

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