首页 > 技术文章 > 第三章家庭作业

chuishi 2015-10-21 14:56 原文

第三章家庭作业

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

结果验证:

推荐阅读