• 深入理解计算机系统家庭作业汇总 20135301&&20135328


    深入理解计算机系统家庭作业

    深入理解计算机系统第二章家庭作业

    题目2.64

    题目要求

    判断二进制数偶数位是否有任意一位位为1,有的话返回1,否则返回0

    解题过程

    int any_even_one(unsigned x)
    { 
    	return !!(x & (0x55555555)); 
    } 
    

    题目2.65

    题目要求

    写出代码实现如下函数:
    int even_ones(unsigned x);

    解题过程

    分析:因为本题受12次操作的限制,故不能按位计算是否该位为1。考虑到本题只需要判断1的个数的奇偶性,而并不需要计算一共有多少个1。那么我们考虑到如果能去掉偶数个1对结果并不会产生影响,这需要快速的去掉偶数个1。因为异或运算恰好可以把同为1时变成0。然后在利用分治的方法,整体异或来减少操作次数。
    操作:
    1.前16和后16位对齐后异或,那么这时候原来32位的奇偶性和目前异或出来的16位的结果一致。
    2.同理前8位和后8位对齐异或。
    3.同理前4位和后4位对齐异或。
    4.同理前2位和后2位对齐异或。
    5.同理前1位和后1位对齐异或。
    最后只需要判断最后那一位上是1还是 0即可。

    int even_ones(unsigned x)  
    {  
    	unsigned  y = x >> 16; x ^= y;  
    	y = x >> 8; x ^= y;  
    	y = x >> 4; x ^= y;  
    	y = x >> 2; x ^= y;   
    	y = x >> 1; x ^= y;   
      
    	return !(x & 1);  
      
    }  
    

    深入理解计算机系统第三章家庭作业

    题目3.66

    题目要求

    你负责维护一个大型的C 程序时,遇到如下代码:

     1 typedef struct {  
     2   int left;  
     3   a_struct a[CNT];  
     4   int right;  
     5 } b_struct;  
     6   
     7 void test(int i, b_struct *bp)  
     8 {  
     9   int n = bp->left + bp->right;  
    10   a_struct *ap = &bp->a[i];  
    11   ap->x[ap->idx] = n;  
    12 }  
    

    通过反汇编代码得出CNT的值和a_struct的完整声明:

     1 000000 <test>:  
     2 0:55push   				%ebp  
     3 1:89 e5 					mov%esp,%ebp  
     4 3:53						push   %ebx  
     5 4:8b 45 08  				mov0x8(%ebp),%eax ;%eax=i  
     6 7:8b 4d 0c  				mov0xc(%ebp),%ecx ;%ecx=bp  
     7 a:8b d8 1c  				imul   	$0x1c,%eax,%ebx ;%ebx=i*28  
     8 d:8d 14 c5 00 00 00 00   lea0x0(,%eax,8),%edx ;%edx=8i;  
     9 14:29 c2					sub%eax,%edx ;%edx=7i;  
    10 16:03 54 19 04  			add0x4(%ecx,%ebx,1),%edx ;%edx=7i+[bp+28i+4]  
    11 1a:8b 81 c8 00 00 00		mov%0xc8(%ecx),%eax ;%eax=right  
    12 20:03 01					add(%ecx),%eax  ;%eax=right+left  
    13 22:89 44 91 08  			mov%eax,0x8(%ecx,%edx,4) ;[bp+4*7i+4*[bp+28i+4]+0x8]=%eax  
    14 26:5b   					pop%ebx  
    15 27:5d   					pop%ebp  
    16 28:c3   					ret  
    

    解题过程

    A CNT=7
    B

        struct a_struct
    	{
    
       		int idx;
    
       		int x[6];
    
        }
    

    下面是简单的分析

    5 i -->eax

    6 bp -->ecx

    7 28i-->ebx

    8 8i-->edx

    9 7i-->edx

    10(28i+bp+4)+7i-->edx 对于C中第10行,我觉得这一行有点难理解,(28i+bp+4)是直接计算出了ap->idx的值,因为a_struct只包含7个int值,所以加7i,就计算出了ap->x[ap->idx]距离a[CNT]的起始地址有多少个int

    11 *(bp+0xc8)-->eax

    12 bp+(bp+0xc8) -->eax 对应C第9行

    13 eax-->(edx4+bp+8) 对应C第11行。

    3.68

    解题过程

    void good_echo()
    {
    char c;
    int x = 0;
    while( x=getchar(), x!=' ' && x!=EOF)
    {
    putchar(x);
    }
    }

    深入理解计算机系统第六章家庭作业

    6.35

    解题过程

    对于写分配的高速缓存,每次写不命中时,需要读取数据到高速缓存中。
    该高速缓存只有2个组,对于相同的i,j,src[i][j]和dst[i][j]对应相同的组。
    src[0] src[2] 对应组0;
    src[1] src[3] 对于组1。
    dst同src。
    dst数组
      列0 列1 列2 列3
    行0 m h m h
    行1 m m h m
    行2 m h m h
    行3 m m h m

    src数组
      列0 列1 列2 列3
    行0 m m m m
    行1 m m m m
    行2 m m m m
    行3 m m m m

    6.36

    解题过程

    缓存能完全容得下两个数组,所以只会出现冷不命中。
    dst数组
      列0 列1 列2 列3
    行0 m h h h
    行1 m h h h
    行2 m h h h
    行3 m h h h

    src数组
      列0 列1 列2 列3
    行0 m h h h
    行1 m h h h
    行2 m h h h
    行3 m h h h

    参考资料

    1.esp和ebp的区别:http://blog.csdn.net/running_noodle/article/details/2838679
    2.寄存器详解:http://wenku.baidu.com/link?url=m0isHkEhemZjFVVi46QzXgfkBdBUaF3FBMTpblEV1bSuWNjgjVHiDjXHXK330-4JuysvJFZE0tSybe6UgP7sQFtjfWDSMAAlrF4gj833uOW
    3.http://wenku.baidu.com/link?url=ZwLOIG3ha7OK1EYU1n3jLKR9zD158bEgXEBu5RteaqhyFa_rntWK5pJ5CjIQoR-bhKNZRjBsHtrEq8JlZeSoSfeXD8bwMJBa4MLGd1Qbiam
    4.http://blog.csdn.net/yang_f_k/article/details/9007303

  • 相关阅读:
    maven 父子模块保持相同
    Maven deploy时排除指定的某个module
    源码,反码,补码
    Java日志之Slf4j,Log4J,logback原理总结
    Git Bash设置代理
    分享2个分布式锁
    二叉树的遍历记忆方法
    MySQL百万级数据分页查询及优化
    eclipse无法访问sun.misc.Unsafe类的解决办法
    Spring学习日志之纯Java配置的MVC框架搭建
  • 原文地址:https://www.cnblogs.com/lalacindy/p/4985863.html
Copyright © 2020-2023  润新知