Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
3年前关闭。
C代码:
基于
我对汇编代码的理解:
外卖店:
每一行的长度为120个字节。
我仍然不完全了解
问题:
哪个寄存器保存指向数组元素
哪个寄存器保存指向数组元素
我的想法:
任何对我的回答或拒绝的确认将不胜感激。
表示
表示
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
3年前关闭。
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
优化的INNER循环的相应汇编代码:.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
任何对我的回答或拒绝的确认将不胜感激。
最佳答案
元素是long
(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]
之间的距离)。09-25 21:11