Translate a statement with array variables

  • Translate the following program statement:

    int A[10];
    short B[20];
    char  k;
    
    int main( )
    {
        B[k] = A[4] + 7;
    }
    

    Assembler code:

    
    
    
    
    
    
    
    
    
    
    
    

Translate a statement with array variables

  • (1) Translate the variable definitions:

    int A[10];
    short B[20];
    char  k;
    
    int main( )
    {
        B[k] = A[4] + 7;
    }
    

    Assembler code:

    
     .data
    
     A: .skip 40
     B: .skip 40
     k: .skip 1
    
    
    
    
    
    

Translate a statement with array variables

  • (2) Translate the statement:   load A[4] into a register (for computation)

    int A[10];
    short B[20];
    char  k;
    
    int main( )
    {
        B[k] = A[4] + 7;
    }
    

    Assembler code:

     .text        // Get A[4] (in r0)
    
     movw r0, #:lower16:A
     movt r0, #:upper16:A
     ldr  r0, [r0, #16]    // r0 = A[4]
    
    
    
    
    
    
    

Translate a statement with array variables

  • (2) Translate the statement:   add 7

    int A[10];
    short B[20];
    char  k;
    
    int main( )
    {
        B[k] = A[4] + 7;
    }
    

    Assembler code:

     .text        // Get A[4] (in r0)
    
     movw r0, #:lower16:A
     movt r0, #:upper16:A
     ldr  r0, [r0, #16]
    
     mov  r1, #7
     add  r0, r0, r1       // r0 = A[4]+7
    
    
    
    

Translate a statement with array variables

  • (2) Translate the statement:   get base address and offset of B[k]

    int A[10];
    short B[20];
    char  k;
    
    int main( )
    {
        B[k] = A[4] + 7;
    }
    

    Assembler code:

     .text        // Get A[4] (in r0)
    
     movw r0, #:lower16:A      movw  r2, #:lower16:k
     movt r0, #:upper16:A      movt  r2, #:upper16:k
     ldr  r0, [r0, #16]	   ldrsb r2, [r2]         // r2 = k
                               add   r2, r2, r2       // r2 = 2k
     mov  r1, #7                                      //    = offset of B[k]
     add  r0, r0, r1   
    
     movw r1, #:lower16:B
     movt r1, #:upper16:B  // r1 = base addr of B[k]
    

Translate a statement with array variables

  • (2) Translate the statement:   store the LHS (r0) in B[k]:

    int A[10];
    short B[20];
    char  k;
    
    int main( )
    {
        B[k] = A[4] + 7;
    }
    

    Assembler code:

     .text        // Get A[4] (in r0)
    
     movw r0, #:lower16:A      movw  r2, #:lower16:k
     movt r0, #:upper16:A      movt  r2, #:upper16:k
     ldr  r0, [r0, #16]	   ldrsb r2, [r2]         // r2 = k
                               add   r2, r2, r2       // r2 = 2k
     mov  r1, #7                                      //    = offset of B[k]
     add  r0, r0, r1           strh  r0, [r1, r2]
    
     movw r1, #:lower16:B
     movt r1, #:upper16:B  // r1 = base addr of B[k]
    

DEMO: demo/asm/3-array/array-example.s