《深入理解計算機系統》 練習題3.9-3.11 移位操作
移位操作
移位操作是二元操作。第一個運算元是移位量,第二個運算元是被移位的數。
移位量只能是立即數,或者放在單位元組暫存器%cl
中。
被移位的數可以是一個暫存器,或者一個記憶體位置。
如果移位操作對w位長的資料,那麼移位量就是%cl
中的低m位的無符號數值(它們的關係是
)。
以%cl
的十六進位制值為0xFF為例:
命令 | 等式 | 有效位 | 移位量 |
---|---|---|---|
salb |
1111 1111 | 111=7 | |
salw |
1111 1111 | 1111=15 | |
sall |
1111 1111 | 11111=31 | |
salq |
1111 1111 | 111111=63 |
左移命令有兩個:sal
和shl
,效果都是一樣的,右邊補0,因為左移不區分算術和邏輯。
右移命令有兩個:sar
和shr
,sar
是算術右移(補上符號位,用
表示),shr
是邏輯右移(補上0,用
表示)。
另外,從我個人理解來看,上面表格的描述也很合理,比如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。