2.3.3 位操作指令
1.逻辑运算指令
逻辑指令提供了对二进制位的控制。逻辑运算指令包括逻辑非(NOT)、逻辑与(AND)、逻辑测试(TEST)、逻辑或(OR)和逻辑异或(XOR)指令。这些指令的操作数可以是8位、16位,其寻址方式与MOV指令的限制相同。表2-5给出了这些指令的名称、格式、功能以及对标志位的影响。
表2-5 逻辑运算指令
逻辑与和逻辑测试的区别在于后者执行后只影响标志位而不改变任何操作数本身。
根据逻辑运算的运算规则,可知各逻辑运算指令的用途是:逻辑非指令可用于把操作数的每一位均变反的场合;逻辑与指令用于把某位清0(与0相与,也可称为屏蔽某位)、某位保持不变(与1相与)的场合;逻辑测试指令可用于只测试某值而不改变操作数的场合;逻辑或指令用于把某位置1(与1相或)、某位保持不变(与0相或)的场合;逻辑异或指令用于把某位变反(与1相异或)、某位保持不变(与0相异或)的场合。
【例2-40】 对AL中的值按位求反。
MOV AL,00001111B
NOT AL;(AL)=11110000B
【例2-41】 设从键盘接收的一个十进制数的ASCII码在AL中,要求把它转换成非压缩BCD码的形式。
AND AL,0FH;清0高4位,低4位不变
【例2-42】 设要把AL中的非压缩BCD码转换成十进制数的ASCII码形式,以便输出。
ORAL,30H;AL中的高4位变成0011B,低4位不变
【例2-43】 使61H端口的D1位变反。
IN AL,61H
XORAL,2
OUT 61H,AL
【例2-44】 AX寄存器清0。
XORAX,AX
这种清0方式比用MOV AX,0占用空间少,执行速度快。
XOR指令还经常用于实现大、小写字母的相互转换,只需将它和00100000B相异或即可。
【例2-45】 转换AL中字母的大小写。
XORAL,20H
【例2-46】 设某并行打印机的状态端口是308H,其D7位是忙/闲位。若D7=0则表示忙,为1则表示闲。测试该打印机当前状态,若为忙继续测试,否则顺序执行下一条指令。
…
MOV DX,308H
LP: IN AL,DX;读入状态字节
TEST AL,80H;只关心D7位,其他位屏蔽,若结果使ZF=1,则表示D7=0
JZ LP;若ZF=1则跳转到LP继续测试,否则顺序执行下一条指令
…
2.基本移位指令
这类指令实现对操作数移位,包括SHL、SAL、SHR和SAR指令。表2-6给出了基本移位指令的名称、格式、功能以及对标志位的影响。其中DST可以是8位、16位的寄存器或存储器操作数,CNT是移位位数。对CNT的限定如下:
①当CNT=1时,直接写在指令中。适用于8086/8088系统。
②当CNT>1时,由CL寄存器给出。适用于80x86系统的所有型号
表2-6 基本移位指令
注① 当CNT=1时,移位使符号位变化把OF置1,否则清0;当CNT>1时,OF值不确定。
可以看出,SHL和SAL指令的功能相同,在机器中实际上它们对应的是同一种操作。
使用这组指令除了可以实现基本的移位操作外,还可以用于对一个数进行2n的倍增或倍减运算,使用这种方法比直接使用乘除法效率要高得多。可以用逻辑移位指令实现无符号数乘除法运算,只要移出位不含1,“SHLDST,n”执行后是原数的2n倍,“SHR
DST,n”执行后是原数的1/2n。可以用算术右移指令实现带符号数的除法运算,只有移出位不含1,“SARDST,n”执行后是原数的1/2n。
【例2-47】 设无符号数X在AL中,用移位指令实现X×10的运算。
MOV AH,0;为了保证不溢出,将AL扩展为字
SALAX,1;求得2X
MOV BX,AX;暂存2X
MOV CL,2;设置移位次数
SALAX,CL;求得8X
ADD AX,BX;10X=8X+2X
3.循环移位指令
这类指令实现循环移位操作,包括ROL、ROR、RCL、RCR指令。表2-7给出了循环移位指令的名称、格式、功能以及对标志位的影响,对DST和CNT的限定同基本移位指令。
表2-7 循环移位指令
【例2-48】 把CX:BX:AX一组寄存器中的48位数据左移一个二进制位。
SHLAX,1
RCLBX,1
RCLCX,1
可以看出,在没有溢出的情况下,以上程序实现了2×(CX:BX:AX)→CX:BX:AX的功能。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。