第三章家庭作业
3.60:
题目要求:求用#difine声明的三维数组的大小
并利用反汇编工程技术推算出A[R][S][T]中,R ,S, T的大小
1.利用二维数组的等式,推算三维数组的地址等式
2.根据汇编代码,计算R S T 的值
解题思路:
1 根据二维数组提供的等式以及数组在内存分布上的特点可以知道,三维数组的基本框架
&D[i][j]=X+L(C*i+j)可以知道,当D[i][j][k]变成三维时,基本框架为&D[i][j][k]=x+L(C1*i+C2*j+k);
2 根据存储空间是按行到列的顺序可以知道,遍历时从i到K的,则对应的C1=(S+1)*(T+1),C2=T+1;
3 对应的三维数组公式为&D=x+L*(C1*i+C2*j+k) (其中,L为字节数,C1 C2已知)
4 根据已知的汇编代码推算公式:
movl 8(%ebp),%ecx #将i的值赋给ECX
movl 12(%ebp),%eax #将j的值赋给eax
leal (%eax,%eax,8) ,%eax #eax:j+8*j=9j
movl %ecx %edx #将i的值给到edx
sall $6 , %edx #edx:i<<6,相当于i*64
subl %ecx,%edx #edx:64i-i=63i
addl %edx,%eax #eax:63i+9j
addl 16(%ebp), %eax #eax:63i+9j+k
movl A(%eax,4),%edx #取出相应地址的存入的数据
movl 20(%edp),%eax #取出*dest
movl %edx ,(%eax) #*dest 赋值
movl $2772 , %eax #将数组总长度表示,即数组大小为2772
由以上的反编译可以知道对应的寻址的地方为63i+9j+k
对应于公式可以知道C2=9; C1=63;
所以T=9-1=8;
S=63/9-1=7-1=6;
由于字节数L是取的4的双字,所以2772/4=693
则R=693/T*S=693/63-1=11-1;
注意事项:
1 在进行翻译的时候,应该明确标记变量所存放的寄存器,更要明确知道进行运算的是寄存器值还是寄存器对应的存储器值
2 数组由于默认规定有0的数值,因而构成的三维数组对应的数值都要减1操作才能保证大小
3 sizeof规定的是申请空间的大小,i j K 则不是对应空间大小而是对应的一个数组下的一个数值
作业结果:
1 对应的三维数组D[R][S][T]=x+4(63i+9j+k)
2 对应的R=11,S=7, T=9
结果验证: