家庭作业二

家庭作业二(Chapter 3)

P206 3.60

考虑下面的源代码,这里R,S,T都是用#define声明的常数

int A[R][S][T];
int store_ele(int i,int j,int k,int *dest)
{
    *dest=A[i][j][k];
    return sizeof(A);
}

编译这个程序,GCC产生下面的汇编代码:(i at %ebp+8,j at %ebp+12,k at %ebp+16,dest at %ebp+20)

movl 8(%ebp),%ecx
movl 12(%ebp),%eax
leal (%eax,%eax,8),%eax
movl %ecx,%edx
sall $6,%edx
subl %ecx,%edx
addl %edx,%eax
addl 16(%ebp),%eax
movl A(,%eax,4),%edx
movl 20(%ebp),%eax
movl %edx,(%eax)
movl $2772,%eax

A.将等式(3-1)从二维扩展到三维,提供数组元素A[i][j][k]位置的公式

B.根据汇编代码,确定R,S,T的值

对上面的汇编代码逐行翻译,可以得到以下内容:

1:i
2:j
3:9j
4:i
5:64i
6:63i
7:63i+9j
8:63i+9j+k
9:A+4(63i+9j+k)
10:dest
11:将dest指向%edx的内容
12:2772即A[R][S][T]的大小

A.不考虑每个元素的大小,A[i][j]起始地位置是iST+jT;而A[i][j][k]起始的位置就是iST+jT+K。考虑A数组有起始位置并且数组元素也有大小(4),所以真正的地址是A(,iST+j*T+K,4)

B.由第9行的A+4(63i+9j+k)=A(,iST+jT+K,4)可以得到:T=9;ST=63;

再有最后的4RS*T=2772可以得出:

R=11;S=7;T=9

posted @ 2015-10-27 17:11  5216  Views(487)  Comments(0Edit  收藏  举报