【发布时间】:2011-09-25 23:21:01
【问题描述】:
这是确切的问题:
以下代码转置 M x M 数组的元素,其中 M 是由#define 定义的常量:
void transpose(Marray_t A) {
int i, j;
for (i = 0; i < M; i++)
for (j = 0; j < i; j++) {
int t = A[i][j];
A[i][j] = A[j][i];
A[j][i] = t;
}
}
当使用优化级别 -02 编译时,GCC 生成以下内容 函数内循环代码:
1. .L3
2. movl (%ebx),%eax
3. movl (%esi,%ecx,4),%edx
4. movl %eax, (%esi,%ecx,4)
5. addl $1, %ecx
6. movl %edx, (%ebx)
7. addl $52,%ebx
8. cmpl %edi,%ecx
9. jl .L3
A. M的值是多少?
B.哪些寄存器保存程序值 i 和 j?
C.编写一个 C 代码版本的转置,利用 在此循环中发生的优化。在你的使用参数 M 代码而不是数字常量。
所以在我试图理解这一点时,我注意到它乘以 4,这意味着它存储了 4 个字节的类型(可能是 int 或指针)。然后,它将 i 增加 $52(我假设 i),因为它是一个更大的值,因此进入下一个数组)并且 $52 / 4 是 13。所以我猜 M = 13。错了吗?
对于 B,我猜想 %ebx 包含 i 而 %ecx 包含 i。
对于 C,我不太确定,因为我不完全理解所呈现的循环。让我尝试通过行号来理解并告诉我我错在哪里。 1. 显然是循环标签的开始。 2. 大概将 i 的值移动到 %eax 中。然后 3. 将 A[i][j] 存储到 t 中。但是……我真的不明白。 :/ 帮助??
【问题讨论】: