家庭作业

2.66

题目:创建一个函数leftmost_one(unsigned x),实现将x除最高有效位1外其他位全部置为0的功能,如果最高有效位为0则返回0

要求:1.遵循位级整数编码规则。

   2.代码中最多只能包含15个算术运算、位运算和逻辑运算。

思路:1.x001xxxxxx则将其与xx100000想于即可得到所求结果。

   2.若想得到xx100000则可通过或运算将001xxxxx转化为00111111,将其取反后为11000000,右移一位可得01100000

   3.x01100000相与即可得到所求结果00100000

函数代码:

运行结果:

   

2.68

题目:构建函数int lower_bits(int n)int 变量的低n位置1,其余位置0

思路:将~0左移n位与-1异或可得结果。

函数代码:

运行结果:

 

3.64

    A.从word_sum代码的第5~7行从栈中的3个值分别是result的返回地址,s1.p,s2.p。

    原因:从word_sum汇编代码第9行可知第6、7行的代码是从栈中调用s1.p,s2.p。由第11行代码及题目中的提示可知ret $4使栈指针增加8所以第5行代码从栈中调用的是result的返回地址。

 

    B.栈帧中分配的5个字段分别用于存储以下值,如下图所示。

原因:从第6,7行可以看出s1.p的位置是%esp+4即-16的位置。从第8,9行可看出s1.v的位置是%esp+8的位置即-12的位置,从第10行可知%esp(-20)为位置为调用word_sum函数的返回地址即&s2。从第13行可知s2.prod的位置为%ebp-8即-8的位置。从第14行可知s2.sum的位置为%esp-4即-4的位置。

 

    C.向函数传递结构体参数的通用策略:结构体的每一个变量可以看做是单独的参数进行传入。

    D.从函数返回结构体值的通用策略:将返回变量的地址看做第一个参数传入函数。而不是在函数中分配栈空间给一个临时变量,因为%eax存不下一个结构体,所以%eax充当返回变量的指针的角色。、

 

3.65

    由结构体str2的C代码和题中汇编代码第一行知4+B=12,所以由数据对齐知,B在栈中被分配的空间为8。

    由str2的C代码知8+4+2B=28,所以由数据对齐知B可以是8或者7。

    再由结构体str1的C代码和题中的汇编代码最后一行知2*A*B=44。

    根据数据对齐的原理可求得A=3,B=7    。

 

 

6.29

由练习题6.13图得

组7中命中的十六进制存储器地址为:

   

(1101111011100)=0x1BDC

(1101111011101)=0x1BDD

(1101111011110)=0x1BDE

(1101111011111)=0x1BDF

组5中命中的十六进制存储器地址为:

(0111000110100)=0x0E34

(0111000110101)=0x0E35

(0111000110110)=0x0E36

(0111000110111)=0x0E37

组4中命中的十六进制存储器地址为:

(1100011110000)=0x18F0

(1100011110001)=0x18F1

(1100011110010)=0x18F2

(1100011110011)=0x18F3

(0000010110000)=0x00B0

(0000010110001)=0x00B1

(0000010110010)=0x00B2

(0000010110011)=0x00B3

组2中没有命中的存储器地址。

   

6.30

posted on 2015-11-08 12:47  20135230潘俊洋  阅读(396)  评论(0编辑  收藏  举报