# 3.65 Multiple Dimension Array II

The following code transposes the elements of an $$M\times M$$ array, where $$M$$ is a constant defined by `#define`:

```c
void transpose(long A[M][M]) {
    long i, j;
    for(i = 0; i < M; i++) {
        for(j = 0; j < i; j++) {
            long t = A[i][j];
            A[i][j] = A[j][i];
            A[j][i] = t;
        }
    }
}
```

When compiled with optimization level `-O1`, GCC generates the following code for the inner loop of the function:

```
.L6:
    movq     (%rdx), %rcx
    movq     (%rax), %rsi
    movq     %rsi, (%rdx)
    movq     %rcx, (%rax)
    addq     $8, %rdx
    addq     $120, %rax
    cmpq     %rdi, %rax
    jne     .L6
```

We can see that GCC has converted the array indexing to pointer code.

A. Which register holds a pointer to array element `A[i][j]`?

%rdx

B. Which register holds a pointer to array element `A[j][i]`?

%rax

C. What is the value of $$M$$ ?

15
