2.66
题目:创建一个函数leftmost_one(unsigned x),实现将x除最高有效位1外其他位全部置为0的功能,如果最高有效位为0则返回0。
要求:1.遵循位级整数编码规则。
2.代码中最多只能包含15个算术运算、位运算和逻辑运算。
思路:1.若x为001xxxxxx则将其与xx100000想于即可得到所求结果。
2.若想得到xx100000则可通过或运算将001xxxxx转化为00111111,将其取反后为11000000,右移一位可得01100000。
3.将x与01100000相与即可得到所求结果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