的C代碼:基於-O1
優化內環陣列轉置和對應的彙編代碼
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;
}
}
對應彙編代碼:
.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
是像在C代碼j
。- 每行的數組長度爲120個字節。
for
以外的循環rdx
可能初始化爲0
。- 我仍然沒有得到
rax
正在返回。
問題:
哪個寄存器保存一個指針數組元素
A[i][j]
?哪個寄存器包含指向數組元素
A[j][i]
的指針?M
的值是多少?
我的想法:
rdx
。rdx
總是增加8,所以它貫穿整行。rsi
也許???rsi
設定爲保持返回值,我想返回值是元素A[j][i]
120/8 = 15
我的答案或拒絕的任何確認,將不勝感激。
這不是一個非常壯觀的問題,但我不明白它是如何過於寬泛的,是關於特定裝配片段的分析。 –