Consider the source code below, where N is a constant declared with #define

 typedef int mat[n][n] //(size_t is defined as unsigned long, which is 8 bytes on x84-64 machines)

 int ele(mat a, size_t i, size_t j){
     return a[i][j];
 }

Suppose this generate the following assembly code:

   ele:
     salq $6, %rsi  // i= i<< 6 = 64i
     addq %rsi, %rdi // a= a + i = a +64i
     movl(%rdi, %rdx, 4), %eax // result = a + 4*j = a + 64i + 4j = a + 8*8*i + 8*1/2*j, since the size(t) = 8

The goal is find n = ____ ? I came up n = 8, you can see my steps in comments. However, the correct answer is n = 16. Can anyone help me find where is the mistake

1 answer

  • answered 2018-11-08 06:08 Siddhesh Rane

    result = a + 64i + 4j = a + 8*8*i + 8*1/2*j, since the size(t) = 8
    

    Your expansion here using 8 is wrong. Look at it this way.

    a + 64i + 4j = a + 16*4i + 4j
    

    Here a is base address of array. i is row selector. Each row contains 16 elements of size 4 (sizeof int) and you skip i such rows to get the base address of the ith row. Then you skip 4j bytes (j ints) to reach the column you want.

    I don't know what your end objective is, but if all you wanted to do was find n, then you could simply have done

    sqrt(sizeof(mat)/sizeof(int))
    

    assuming you are sure that it is an int array of square shape.