1

我真的对我的家庭作业感到困惑。我们得到 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;
        }
    }
}
4

1 回答 1

1
1 .L3:
2 movl (%ebx), %eax         // eax := read memory word at ebx
3 movl (%esi,%ecx,4), %edx  // edx := read memory word at esi + 4*ecx
4 movl %eax, (%esi,%ecx,4)  // store eax into that location
5 addl $1, %ecx             // add 1 to ecx
6 movl %edx, (%ebx)         // store edx into memory at ebx
7 addl $52, %ebx            // add 52 to ebx
8 cmpl %edi, %ecx           // compare edi & ecx
9 jl .L3

所以在这段代码中。%ebx是 的地址A[j][i]%esi是 的地址,A[i]%ecxj。52 是sizeof(A[j]),所以 M 可能是 13(因为数组元素大小是 4)

于 2013-10-30T02:41:35.753 回答