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

  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/lwr-/p/4914863.html
Copyright © 2011-2022 走看看