《深入理解计算机系统》 练习题3.9-3.11 移位操作

移位操作

移位操作是二元操作。第一个操作数是移位量,第二个操作数是被移位的数。
移位量只能是立即数,或者放在单字节寄存器%cl中。
被移位的数可以是一个寄存器,或者一个内存位置。
如果移位操作对w位长的数据,那么移位量就是%cl中的低m位的无符号数值(它们的关系是2m=w2^m=w)。
%cl的十六进制值为0xFF为例:

命令 等式 有效位 移位量
salb 23=82^3=8 1111 1111 111=7
salw 24=162^4=16 1111 1111 1111=15
sall 25=322^5=32 1111 1111 11111=31
salq 26=642^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。

posted @ 2018-11-22 11:50  allMayMight  阅读(363)  评论(0编辑  收藏  举报