您的位置:首页 > 其它

[汇编]8086指令系统---逻辑指令

2016-07-20 15:45 330 查看
[汇编]8086指令系统---逻辑指令   逻辑指令包括逻辑运算指令和移位指令。逻辑运算指令可对操作数执行逻辑运算,移位指令执行对操作数左移或右移若干位的功能。 ⑴ 逻辑运算指令          ⑵ 移位指令

   AND     逻辑与          SAL     算术左移

   OR      逻辑或          SHR     逻辑右移

   OT      逻辑非          SAR     算术右移

   XOR     异或           ROL    循环左移

   TEST     测试           ROR    循环右移

                     RCL    带进位循环左移

                     RCR    带进位循环右移 1 逻辑运算指令

 AND dst,src ;逻辑与(logic and)

 执行操作: (dst)←(dst)(src)

 OR dst,src ;逻辑或(logic or)

 执行操作: (dst)←(dst)(src)

 NOT opr ;逻辑非(logic not)

 执行操作: (opr)←

 XOR dst,src ;异或 (exclusive or)

 执行操作: (dst)←(dst)(src)

 TEST opr1,opr2 ;测试(test)

 执行操作: (opr1)(opr2),根据与运算结果设置条件码,结果不回送

  逻辑运算指令是一组位操作指令,它们可以对字或字节按位执行逻辑操作,因此,源操作数经常是一个位串。以上五条指令除NOT不影响标志位外,其它四条指令执行后,CF和OF置0,AF无定义,SF、ZF和PF根据运算结果设置。

  例 (1) 可使某些位置0的AND运算

      MOV   AL,35H    ; (AL)=0011 0101B

      AND   AL,0FH    ; (AL)=35H0FH=0000 0101B

       ; flag settings will be: SF=0,ZF=0,PF=1,CF=OF=0

      (2) 可使某些位置1的OR运算

       MOV   AX,0504H   ; (AX)=0000 0101 0000 0100B

       OR   AX,80F0H   ; (AL)=0504H80F0H=1000 0101 1111 0100B,

                 ; flags will be: SF=1,ZF=0,PF=0,CF=OF=0

   注意:标志位PF按结果的低8 位来设置。

       (3) XOR运算使两个操作数不同值的位置1,相同值的位置0

  

       A.使某些位求反,其余位不变

       MOV  BL,86H    ; (BL)=1000 0110B

       XOR  BL,03H    ; (BL)=86H03H=1000 0101B,

          ; flags will be: SF=1,ZF=0,PF=0,CF=OF=0

       B.使某寄存器清0

       XOR  AX,AX  ; (AX)=0, clear AX by XORing it with itself

       (4) 测试某些位为0或为1

       A.测试某数的奇偶性

       MOV  DL,0AEH    ; (DL)=1010 1110B

       TEST DL,01H ; 0AEH01H=0000 0000, ZF=1,but DL is unchanged

       JZ EVEN ; if ZF=1,then tested number is even, if ZF=0, odd

       B.测试某数为正数或负数

       MOV  DH,9EH    ; (DL)=1001 1110B

       TEST DH,80H    ; 9EH80H=1000 0000, ZF=0

       JZ EVEN ; if ZF=0,then the value is negative, if ZF=1,it is

  2 移位指令

  移位指令包括逻辑移位指令、算术移位指令、循环移位指令和带进位循环移位指令。指令中的目的操作数dst可以是除立即数外的任何寻址方式。移位次数(或位数)cnt=1时,1可直接写在指令中;cnt>1时,cnt必须放入CL寄存器。

 

 SHL dst,cnt ; 逻辑左移(shift logical left)

 SHR
 dst,cnt ; 逻辑右移(shift logical right)

 SAL dst,cnt ; 算术左移(shift arithmetic left)

 SAR dst,cnt ; 算术右移(shift arithmetic right)

  SHL和SAL指令向左移动的操作是相同的,在每次逐位移动后,最低位用0来补充,最高位移入CF。SHR与SHL移动的方向相反,每次向右移动后,最高位用0来补充,最低位移入CF。SAR在每次右移都用符号位的值补充最高位,最低位仍然是移入CF。

  由此可以看出,算术移位适于带符号数的移位处理。我们知道,一个数左移n位相当于乘以2n,右移n位相当于除以2n,所以,当一个带符号数需要乘(或除)2n时,可使用算术移位指令SAL(或SAR)。当一个无符号数需要乘(或除)2n时,可使用逻辑移位指令SHL(或SHR)。使用移位指令将一个数扩大或缩小2n倍,比使用乘法或除法指令的速度快。

  移位指令的条件码设置:

  CF= 移入的数值

  OF=1 当cnt=1时,移动后最高位的值发生变化

  OF=0 当cnt=1时,移动后最高位的值未发生变化

  SF、ZF、PF根据移动后的结果设置

 ROL dst,cnt ; 循环左移(rotate left)

 ROR dst,cnt ; 循环右移(rotate right)

 


 RCL dst,cnt ; 带进位循环左移(rotate left through carry) 

 RCR dst,cnt ; 带进位循环右移(rotate right through carry)

  这组指令完成位循环移位的操作,ROL和ROR是简单的位循环指令,RCL和RCR是连同CF位一起循环移位的指令。它们左右移动的方法以及移位次数的设置与移位指令类似。

  循环移位指令执行后,CF和OF的设置方法与移位指令相同;SF、ZF和PF标志位不受影响。

例 写DATA1除以8的程序,假设:⑴DATA1为无符号数⑵DATA1为带符号数。

      DATA1  DB   9AH

      TIMES  EQU   3

      ; ⑴ DATA1 is unsigned operand

         MOV   CL,TIMES   ; set number of times to shift

         SHR    DATA1,CL   ; DATA1 will be 13H, CF=0

         

       ; ⑵ DATA1 is signed operand

         MOV    CL,TIMES   ; set number of times to shift

         SAR    DATA1, CL   ; DATA1 will be 0F3H, CF=0

例 编写统计DATAW字数据中1的个数COUNT的程序,要求COUNT是BCD码。

  

      DATAW  DW   97F4H

      COUNT  DB   ?

      …    …

       XOR   AL,AL   ; clear AL to keep the number of 1s in BCD

       MOV   DL,16   ; rotate total of 16 times

       MOV   BX,DATAW ; move the operand to BX

    AGAIN: ROL   BX,1    ; rotate it once

       JNC   NEXT   ; check for 1, if CF=0 then jump

       ADD   AL,1   ; if CF=1 then add one to count

       DAA        ; adjust the count for BCD

    NEXT: DEC   DL     ; go through this 16 times

        JNC   AGAIN   ; if not finished go back

       MOV   COUNT,AL ; save the number of 1s in COUNT

收藏于 2009-03-25
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编语言