位操作指令小结

这类指令包括逻辑运算指令、移位指令和循环指令。

1.逻辑运算指令

8086/8088指令系统的逻辑运算指令有“与”(AND)、“测试”(TEST)、“或”(OR)、“异或”(XOR)和“非”(NOT)五条。

除了“非”指令对状态标志位不产生影响外,其余四条指令对状态标志位均有影响。这些指令将根据各自逻辑运算的结果影响SF、ZF和PF状态标志位,同时将CF和OF置“0”,但AF的值不确定。

    (1)逻辑“与”指令

    指令格式  AND  DST,SRC

        能:  DST←DST∧SRC

操作说明:  AND指令将目的操作数和源操作数按位进行逻辑“与”运算(即相“与”的两位均为1时结果为1,否则为0),将结果送回目的操作数。指令中目的操作数可以是寄存器或存储器,源操作数可以是立即数、寄存器或存储器。但是指令的两个操作数不能同时是存储器。

    用: AND指令可以有选择地屏蔽某些位(有选择地清0),而保留另一些位不变。

【例2.32】  AND  AL,3CH           ;8位二进制分别进行与运算

AND  AX,BX             ;16位二进制分别进行与运算

AND  DX,BUFFER[SI]

AND  [DI],CX

【例2.33】  MOV  AL,1011010lB    ;AL=1OllOl01B

AND  AL,0FH            ;AL=00000101B,保留低四位,高四位清0

    (2)测试指令

    指令格式:  TEST  DST,SRC

          DST ∧ SRC

    操作说明:  TEST指令将目的操作数和源操作数按位进行逻辑“与”运算,但逻辑运算的结果不送回目的操作数,即仅做DST∧SRC运算,两个操作数的内容均保持不变,但运算结果影响状态标志位。

        用:TEST指令常常用于位测试,它与条件转移指令一起,共同完成对特定位状态的判断,并实现相应的程序转移。

    例2.34】 测试AL的最高位是否为零,若不为零,则转移到NEXT。

TEST    AL,10000000B

JNZ    NEXT

                 

    NEXT:  ……

    (3)逻辑“或”指令

    指令格式:  OR DST,SRC

        能:  DST←DST∨SRC

    操作说明:  将目的操作数和源操作数按位进行逻辑“或”运算(即相“或”的两位中任一位为1时结果为1,只有两位都为0时结果才为0),并将结果送回目的操作数。

        用:  OR指令操作数的类型与AND指令相同。OR指令可将寄存器或存储器中的某些特定的位设置成“1”,同时使其余位保持原来的状态不变。

    例2.35  若将AL寄存器的最高位置“1” ,而保持其余位不变时,可用如下指令:

           OR  AL,10000000B        ;AL←AL∨(10000000B)

    (4)逻辑“异或”指令

    指令格式:  XOR  DST,SRC

        能:  DST←DST⊕SRC

    操作说明:  XOR指令将目的操作数和源操作数按位进行逻辑“异或”运算(即相“异或”的两位数不相同时结果为“1”,相同时则为“0”),并将结果送回目的操作数。XOR指令操作数的类型与AND、OR指令均相同。

    用: XOR指令可将寄存器或存储器中的某些特定的位“求反”,而使其余位保持不变。XOR指令的另一个用途是将寄存器的内容清0。XOR指令和AND、OR等指令一样,也会将进位标志CF清0。

    例2.36  使AL寄存器中的第1、3、5、7位求反,第0、2、4、6位保持不变,可将AL和10101010B(即OAAH)“异或”。

           MOV  AL,0FH          ;AL=0FH

           XOR  AL,10101010B    ;AL=1O1OOl01B(0A5H)

2.37  XOR  AX,AX    ;将AX清0,同时将CF清0

   (5)逻辑“非”运算

指令格式:  NOT  DST

    能:  DST←

    操作说明:  NOT指令使目的操作数按位取反,即其中所有“0”的位变为“1”,所有“1”的位变为“0”。其操作数可以是8位或16位的寄存器或存储器,但不能对立即数执行逻辑“非”操作。

    例2.38NOT  AH

NOT  WORD  PTR[BX][DI]

2.移位指令

8086/8088指令系统的移位指令可以向左或向右移位,移位次数由COUNT决定,COUNT为1时移动一位,可直接写于指令中。要求移多位时,移动位数必须事先放在CL寄存器中。移位指令影响除AF外的其他状态标志位。

    (1)逻辑左移指令

指令格式: SHL DST,COUNT                         

    操作说明:SHL指令将目的操作数顺序向左移1位或移CL寄存器中指定的位数。左移1位时,操作数的最高位MSB移入进位标志CF,最低位LSB补0,相当于无符号数乘上2。

    例2.39MOV  AH,8BH

MOV  CL,3

SHL  AH,CL     ;SI内容左移3位

    (2)逻辑右移指令

    指令格式:    SHR  DST,COUNT

操作说明  SHR将目的操作数顺序向右移1位或移CL寄存器中指定的位数。低位移入CF,高位补0。无符号数右移1位相当于除以2。

2.40MOV   BL,20H        ;BL=20H

SHR   BL,1          ;BL=10H

3)算术左移指令

指令格式:SAL DST,COUNT  

操作说明SAL指令将目的操作数顺序向左移1位或移CL寄存器中指定的位数。操作与SHL完全相同。

2.41SAL  WORD  PTR[BX+50],1       

4)算术右移指令

指令格式:SAR  DST,COUNT

    操作说明:SAR指令将目的操作数向右移1位或由CL寄存器指定的位数。右移一位时,操作数的最低位LSB移入进位标志CF,最高位MSB保持不变。对带符号数算术右移一位相当于将该数除以2。

2.42

SAR  AL,1

SAR  DI,CL

SAR  WORD  PTRTABLE[SI],1

SAR  BYTE  PTR[BX],CL

    4.循环移位指令

8086/8088指令系统有四条循环移位指令,包括不带进位和带进位循环移位。指令中指定的左移或右移的位数COUNT可以是1或由CL寄存器指定。所有循环移位指令都只影响进位标志CF和溢出标志OF。

 (1)循环左移指令

  指令格式: ROL  DST,COUNT

  操作说明: ROL指令将目的操作数顺序向左移1位或移CL寄存器中指定的位数。左移1位时,操作数的最高位MSB移入进位标志CF的同时,还移到最低位LSB形成循环,进位标志位不在循环环内。

    例2.43 ROL  AH,1      ;8位二进制数循环左移1位

ROL  DX,CL     ;16位二进制数循环左移CL位

操作说明:ROR指令将目的操作数顺序向右移1位或右移CL寄存器中指定的位数。右移1位时,操作数的最低位LSB移入进位标志CF的同时,还移到最高位MSB形成循环,进位标志位不在循环环内。

 (2)循环右移指令

  指令格式: ROR  DST,COUNT

  操作说明:ROR指令将目的操作数顺序向右移1位或移CL寄存器中指定的位数。右移1位时,操作数的最低位LSB移入进位标志CF的同时,还移到最高位MSB形成循环,进位标志位不在循环环内。

2.44ROR  CX,1

ROR  DX,CL

 (3)带进位循环左移指令

指令格式:RCL    DST,COUNT

    操作说明:RCL指令将目的操作数连同进位标志CF一起向左循环移动1位或CL寄存器中指定的位数。移动一位时,最高位MSB移入CF,而原CF移入最低位LSB。

【例2.45】ROR  CX,1

ROR  DX,CL

    (4)带进位循环右移

指令格式: RCR  DST,COUNT

操作说明:RCR指令将目的操作数连同进位标志CF一起向右循环移动1位或由CL寄存器中指定的位数。移动一位时,最低位LSB移入CF,而原CF则移入最高位MSB。

【例2.46】 测试AL寄存器中第5位的状态,为“0”时转向ZERO,否则向下继续执行。

方法1  用循环移位指令实现:

              MOV  CL,6

              ROR  AL,CL    ;将AL的bit5移入CF

              JNC  ZERO      ;若CF=0,则转向ZERO处

                             ;否则,继续执行

    ZERO:  ……

方法2:用测试指令实现:

TEST    AL,20H      ;将AL与20H相“与”

JZ    ZERO           ;若结果为0,则转向ZERO处

                   ;否则,继续执行

ZERO:  ……  

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值