zoukankan      html  css  js  c++  java
  • 家庭作业二

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

  • 相关阅读:
    Spark 基本概念及入门
    Cron 表达式详解
    VmWare 网络模式
    微信、支付宝各种支付退款
    Spring Security OAuth2 SSO 单点登录
    Git 入门详解
    基于Spring Boot 2.x 的 Spring Cloud Admin 实践
    Git 提交规范
    Linux 安装 Mysql8.0
    Docker入门
  • 原文地址:https://www.cnblogs.com/lwr-/p/4914863.html
Copyright © 2011-2022 走看看