2016-02-21 3 views
-2

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

Соответствующий код сборки на основе -O1 оптимизации для внутреннего цикла:

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

Мое понимание ассемблере:

1. movq (%rdx), %rcx 
     int *rdx = ? 
     int rcx = *rdx 

2. movq (%rax), %rsi 
     int *rax = ? 
     int rsi = *rax 

3. movq %rsi, (%rdx) 
     *rdx = rsi = *rax 

4. movq %rcx, (%rax) 
     *rax = rcx = *rdi 

5. addq $8, %rdx 
     rdx +=8 

6. addq $120, %rax 
     rax += 120 

7. cmpq %rdi, %rax 
    jne .L6 
     int rdi = ? 
     if (rdi != rax) jump to L6 

вылет:

  • rdx увеличивается на 8.
  • rdx подобен j в коде C.
  • Каждая строка имеет длину 120 байтов в массиве.
  • за пределами for петля rdx, вероятно, инициализируется в 0.
  • Я все еще не получаю именно то, что возвращается rax.

Вопросы:

  1. Какой регистр содержит указатель на массив элементов A[i][j]?

  2. В каком регистре содержится указатель на элемент массива A[j][i]?

  3. Какая ценность M?

Мое мышление:

  1. rdx. rdx всегда поднимается на 8, поэтому он проходит через весь ряд.

  2. rsi возможно ??? rsi устанавливается для хранения возвращаемого значения, и я думаю, что возвращаемое значение является элементом A[j][i]

  3. 120/8 = 15

Любое подтверждение моего ответа или отклонения будут оценены.

+0

Это не впечатляющий вопрос, но я не могу понять, насколько он слишком широк, что касается анализа конкретного фрагмента сборки. –

ответ

1

элементы являются long s (8 байтов), и вы исследуя внутреннюю петлю (на j), так:

rdx +=8 

означает rdx явно указывает на A[i][j].

rax += 120 

означает rax указывает на A[j][i].

M равен 15, как строка имеет длину 120 байт (расстояние в байтах между A[j][i] и A[j+1][i]), и каждый из long имеет длину 8 байт (расстояние между A[i][j] и A[i][j+1]).

+0

Я понял. Я потерял фокус на внутренней петле и думал о ней. – sam

Смежные вопросы