家庭作业二(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