4.3.3 按位运算指令
在目前计算机广泛应用的情况下,计算机大量的工作不是进行算术运算,而是进行信息处理、信息传送,这些都需要大量的位运算。位运算指令分为逻辑运算和移位运算两类,逻辑运算指令可对操作数执行的逻辑运算包括逻辑与、逻辑或、逻辑非、逻辑异或等,移位指令执行对操作数逻辑移位、循环移位等。
1.逻辑运算
(1)逻辑与运算指令AND
对两个操作数实现按位逻辑“与”运算,结果送回目的操作数中,可实现字节或字的“与”运算,本指令主要用于修改目的操作数,用于使某些位置清0,某些位不变,需要清0的位与0“与”,不变的位与1“与”。
例如:
(2)逻辑或指令OR
对两个操作数实现按位逻辑“或”运算,结果送回目的操作数中,可实现字节或字的“或”运算,本指令主要用于修改目的操作数,可使某些位置1,某些位置不变,需要置1的位与1“或”,不变的位与0“或”,也可对两个操作数进行组合操作。
例如:
(3)逻辑非指令NOT
完成对操作数按位求反运算,结果送回原操作数,可实现取操作数的反码运算。
例如:
(4)逻辑异或指令XOR
对两个操作数实现按位“异或”运算,结果送回目的操作数中。
异或操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位取反的操作场合,把要维持不变的这些位与0相“异或”,而把要取反的这些位与1相“异或”。
例如:
例如,要使AX 的1、3、5和15位置反,0,2,4和13位清0,6、10、12和14位置1,其余位不变,指令代码如下:
2.移位运算
(1)逻辑左移指令SHL
对给定的目的操作数(8位或16位)左移,最高位移入进位标志位CF中,移位后空出的最低位补零;因左移1位相当于将一个无符号数倍增(乘2),故本指令又常用作数的倍增操作,其操作示意如图4.18所示。
图4.18 SHL指令操作过程
例如,不用乘法指令编写程序段实现AX 乘以10送AX 中(假设不会溢出):
(2)逻辑右移指令SHR
图4.19 SHR 指令操作过程
对给定的目的操作数(8位或16位)右移,最低位移入标志位CF中,左边最高位空位补零,SHR 指令适用于将一无符数减半,右移1 位等于将数除以2。其操作示意如图4.19所示。
例如,将AL中的压缩BCD 码转化为两个字节的ASCII码送BX。
(3)循环左移指令ROL
将目的操作数中的8位或16位二进制数向左移动1位或CL位,从左边移出位既移入CF又移入右边的空出位,最后移出位移至最右边位(即最低位),同时保留在CF。其操作示意如图4.20所示。
例如:
(4)循环右移指令ROR
ROR指令与ROL指令类似,只是目的操作数(字或字节)中的各位循环右移,而不是循环左移,操作示意如图4.21所示。
图4.20 ROL指令操作过程
图4.21 ROR 指令作过程
循环移位时移出操作数的位并不丢失,而是循环送回操作数的另一端。移位的位数也由计数值操作数规定,计数值可以指定为常数1,或指定为CL寄存器。