8086/8088指令系统详解之(3)位操作指令

时间:2023-01-01 00:44:15

位操作指令

1,逻辑运算指令
2,移位指令
3,循环移位指令

1,逻辑运算指令

8086/8088指令系统详解之(3)位操作指令

说明:TEST相当于AND运算,但是不保存结果,仅影响标志。

常见的用法举例:

清进位标志位: AND AX,AX 或 OR AL,AL等。

清零操作数:XOR AX,AX 不仅把AX清零,而且也影响了状态标志。

把某几位取反:用XOR指令,把要取反的位和1异或,不变的位和0异或。

清零或置位某几位:用AND指令清零,用OR指令置位。

2,移位指令

8086/8088指令系统详解之(3)位操作指令

该类指令的使用方法是:
⑴ 移动1位,用类似于 SHL AX,1的格式
⑵ 移动n位,用类似于 SHL AX,CL的格式

说明:
⑴ 逻辑移位适用于无符号数,算术移位适用于有符号数。
⑵ 逻辑左移和算术左移的机器码完全相同,是助记符的两种写法。

3,循环移位指令

8086/8088指令系统详解之(3)位操作指令
ROL循环左移:操作数整体左移,最高位移到CF,同时最高位补原最低位。
ROR循环右移:操作数整体右移,最低位移到CF,同时最低位补原最高位。
RCL带进位的循环左移:操作数整体左移,最高位移到CF,同时CF移到最低位。
RCR带进位的循环右移:操作数整体右移,最低位移到CF,同时CF移到最高位。

使用举例
[例一] 利用循环移位指令可以对寄存器或存储器中的任一位进行测试。如要测试AL寄存器中的第5位的状态是“0”还是“1”,则可利用以下指令实现:

   MOV CL,5         ;(CL)移位次数
   ROR AL,CL        ;(CF)AL的第5位
   JNC ZERO         ;若(CF)=0,转ZERO
    ………………         ;否则
   ZERO: …………

[例二]利用带进位循环移位指令可以实现将两个以上寄存器或存储器单元组合起来一起移位。如DX和AX两个寄存器组成的32位数乘以2,可用以下两条指令实现:
SHL AX,1 ;AX左移1位,(CF)AX的最高位
RCL DX,1 ;DX带进位左移1位,DX的最低位(CF)
具体操作如下图:、
8086/8088指令系统详解之(3)位操作指令