天天看點

家庭作業

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

家庭作業