4.3.3 按位运算指令

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寄存器。