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