我真的对我的家庭作业感到困惑。我们得到 C 代码,然后是下面列出的汇编。这是 x86 程序集。任何帮助将不胜感激。我已经尝试根据我的理解来解决它。
C代码:
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;
}
}
仅内部循环的汇编代码:
1 .L3:
2 movl (%ebx), %eax //is this getting the mem location of %ebx and setting to %eax?
3 movl (%esi,%ecx,4), %edx //ecx * 4 + esi into edx
4 movl %eax, (%esi,%ecx,4) //
5 addl $1, %ecx //add 1 to ecx
6 movl %edx, (%ebx) //move edx to mem location of ebx???
7 addl $52, %ebx //I think this is M but I could be wrong
8 cmpl %edi, %ecx //compare edi & ecx
9 jl .L3
这是我必须回答的:
A. M 的值是多少?...我认为这是 52...?
B. 哪些寄存器保存程序值 i 和 j?...我认为edx和eax?
C. 编写一个 C 代码版本的转置,利用该循环中发生的优化。在代码中使用参数 M 而不是数字常量。
尝试 (C):
void tranpose(Marray_t A) {
int i, j;
for(i = 0; i < M; i++) {
for(j = 0; j < i; j++) {
int *row = &A[i][0];
int *col = &A[0][j];
int value = (*row * 4) + *col;
}
}
}