Arrays and Pointers


Consider the following C code segment:

        /* Copy numVals values from A into B */
        int i;
        for ( i = 0; i < numVals; i++ )
            B[i] = A[i];


This can be written using array indexing or pointers.

Using Array IndexingUsing Pointers
/* Copy numVals values from A into B */
int i;
for ( i = 0; i < numVals; i++ )
    B[i] = A[i];
/* Copy numVals values from A into B */
int * ptrA, * ptrB;
for ( ptrA = A, ptrB = B; ptrA < A + numVals;
      ptrA++, ptrB++ )
        *ptrB = *ptrA;


MIPS translation using array indexing:

C Array IndexingMIPS Equivalent
/* Copy numVals values from A into B */
int i;
for ( i = 0; i < numVals; i++ )
    B[i] = A[i];

        move $t0, $zero
LOOP:   slt $t1, $t0, $a2
        beq $t1, $zero, ENDLP
        sll $t2, $t0, 2
        add $t3, $a0, $t2
        add $t4, $a1, $t2
        lw  $t5, 0($t3)
        sw  $t5, 0($t4)
        addi $t0, $t0, 1
        j LOOP
ENDLP:  ...
# $a0 = A, $a1 = B, $a2 = numVals
# $t0 = i = 0
# $t1 = 1 if i < numVals
# leave loop if i >= numVals
# $t2 = 4 * i
# t3 = A + 4i, i.e., &A[i]
# t4 = B + 4i, i.e., &B[i]
# read A[i] into $t5
# store $t5 out to B[i]
# increment i
# jump to top of loop
  Body of loop (array access) is highlighted; loop components are not.


MIPS translation using pointers:

C PointersMIPS Equivalent
/* Copy numVals values from A into B */
int * ptrA, * ptrB;
for ( ptrA = A, ptrB = B; ptrA < A + numVals;
      ptrA++, ptrB++ )
        *ptrB = *ptrA;

        move $t0, $a0
        move $t1, $a1
        sll $t2, $a2, 2
        add $t2, $a0, $t2
LOOP:   slt $t3, $t0, $t2
        beq $t3, $zero, ENDLP
        lw  $t4, 0($t0)
        sw  $t4, 0($t1)
        addi $t0, $t0, 4
        addi $t1, $t1, 4
        j LOOP
ENDLP:  ...
# $a0 = A, $a1 = B, $a2 = numVals
# $t0 = ptrA = A  (or &A[0])
# $t1 = ptrB = B  (or &B[0])
# $t2 = 4 * numVals
# $t2 = A + 4 * numVals
# $t3 = 1 if ptrA < A + 4*numVals
# leave loop if ptrA >= A + 4*numVals
# read *ptrA into $t4
# store $t4 out to *ptrB
# increment ptrA  (by 4 because ptr to int)
# increment ptrB  (by 4 because ptr to int)
# jump to top of loop
# after loop, return to address in $ra
  Body of loop (array access) is highlighted; loop components are not.


Alyce Brady, Kalamazoo College