《深入理解计算机系统》 练习题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。