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
.
Вопросы:
Какой регистр содержит указатель на массив элементов
A[i][j]
?В каком регистре содержится указатель на элемент массива
A[j][i]
?Какая ценность
M
?
Мое мышление:
rdx
.rdx
всегда поднимается на 8, поэтому он проходит через весь ряд.rsi
возможно ???rsi
устанавливается для хранения возвращаемого значения, и я думаю, что возвращаемое значение является элементомA[j][i]
120/8 = 15
Любое подтверждение моего ответа или отклонения будут оценены.
Это не впечатляющий вопрос, но я не могу понять, насколько он слишком широк, что касается анализа конкретного фрагмента сборки. –