• 第三章家庭作业


    第三章家庭作业

    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

    结果验证:

  • 相关阅读:
    金额转换问题
    进制转换(十进制->二进制、八进制、十六进制)
    Linux下Tomcat的安装
    Linux下安装jdk配置java环境变量
    Linux下安装Mysql
    在Linux下安装Redis
    Redis常用操作
    阿里云服务器部署tomcat服务器无法访问
    mysql 创建数据库 编码
    docker 安装oracle
  • 原文地址:https://www.cnblogs.com/chuishi/p/4897808.html
Copyright © 2020-2023  润新知