1. 程式人生 > >《深入理解計算機系統》 練習題3.9-3.11 移位操作

《深入理解計算機系統》 練習題3.9-3.11 移位操作

移位操作

移位操作是二元操作。第一個運算元是移位量,第二個運算元是被移位的數。
移位量只能是立即數,或者放在單位元組暫存器%cl中。
被移位的數可以是一個暫存器,或者一個記憶體位置。
如果移位操作對w位長的資料,那麼移位量就是%cl中的低m位的無符號數值(它們的關係是 2 m = w

2^m=w )。
%cl的十六進位制值為0xFF為例:

命令 等式 有效位 移位量
salb 2 3 =
8 2^3=8
1111 1111 111=7
salw 2 4 =
16 2^4=16
1111 1111 1111=15
sall 2 5 = 32 2^5=32 1111 1111 11111=31
salq 2 6 = 64 2^6=64 1111 1111 111111=63

左移命令有兩個:salshl,效果都是一樣的,右邊補0,因為左移不區分算術和邏輯。
右移命令有兩個:sarshrsar是算術右移(補上符號位,用 > > A >>_A 表示),shr是邏輯右移(補上0,用 > > L >>_L 表示)。
另外,從我個人理解來看,上面表格的描述也很合理,比如salb是一個位元組,8位的,然後這裡是最大的移位量是7位,因為如果可以移位8位的話,那麼所有位上的數都是移位後補的數了,一個原來的數都不存在了。

3.9

在這裡插入圖片描述
在這裡插入圖片描述
需要補全的是,第二條和第四條命令,這裡直接給出答案。
第二條命令,因為是long,8位元組,所以這裡是q,另外這裡的移位量是一個立即數。
%ecx和%cl是相同暫存器,只不過前者位元組數更多。不過,第三條命令這裡有點奇怪,因為獲得的是,兩個字,四個位元組,註釋裡也說了。不過不打緊,反正最終我們使用的是最小位元組數的暫存器%cl。
然後到了第四條命令,果然使用的是%cl。

因為只有最低位元組暫存器%cl才指示了移位量。

3.11

在這裡插入圖片描述
在這裡插入圖片描述
直接給出答案。
總結一下就是x^x即x異或x自己肯定是0.
將一個4字,8位元組的變數置為0(變數存在暫存器%rdx),有以下三種指令:
1)xorq %rdx %rdx。利用異或性質。
2)movq $0 %rdx。利用mov資料傳送指令。
3)xorl %edx %edx or movl $0 %edx。利用任何更新低位4位元組的指令都會把高位的4位元組設定為0。