计组(day6)8086指令系统——逻辑指令

0. 逻辑运算指令

8088/8086提供的逻辑运算指令共有5条:AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR(逻辑异或)及TEST(测试)指令。
操作数: 8位或16位寄存器或存储单元
功能: 按位操作
对标志位的影响: 除NOT外,都会使CF=OF=0,AF值不定,并对SF、PF和ZF有影响。NOT指令对所有标志位都不影响。

1. 逻辑“与”指令AND

指令格式: AND destination,source ;
功能: 使源操作数和目标操作数按位相“与”,结果送回目标操作数中。
主要应用于:
(1)实现两操作数按位相“与”
(2)使目标操作数中某些位保持不变,把其他位清0.
(3)使操作数不变。但影响6个状态标志位,并使CF=OF=0.

1.1 AND指令应用示例

  1. 实现来操作数按位相“与”

    F0E0 “与” 001F = 0000

code segment
start:        
    MOV BX,0000H
    MOV [BX],0F0E0H
    MOV AX,001FH   
    AND AX,[BX]
    
    MOV AX,4C00H
    INT 21H
 
code ends
end start ;

运行结果:
在这里插入图片描述
从运行结果可以看出AND指令影响了状态标志位ZF和PF

  1. 使目标操作数中某些位保持不变,把其他位清0
    方法:保持的位AND1,清零的位AND0
    如 , 将 3FH的高4位清零第四位保持
code segment
start:        
    MOV AL,3FH 
    AND AL,0FH
    
    MOV AX,4C00H
    INT 21H
 
code ends
end start ;

在这里插入图片描述
3. 使操作数不变,但影响6个状态标志位,并使CF=OF=0。
目的是清零CF和OF标志位。

code segment
start:        
    MOV AL,3FH 
    AND AL,AL
    
    MOV AX,4C00H
    INT 21H
 
code ends
end start ;

运行结果:
在这里插入图片描述

2. 逻辑“或”指令OR

指令格式: OR destination,source ;
功能: 实现对源操作数和目标操作数按位相“或”,结果送回目标操作数中。
主要应用于:
(1)实现两操作数按位相“或”
(2)使目标操作数某些位不变,将另一些位置1
(3)使操作数不变,但影响6个状态标志位,并使CF=OF=0。

2.1 OR指令应用示例

  1. 实现两操作数按位相“或”
    34 "与“ 56 = 0011 0100 或 0101 0110 = 0111 0110 = 76H
    在这里插入图片描述
  2. 使目标操作数某些位不变,将另一些位置1
    方法: 置一的位OR1,不变的位OR0
code segment
start:        
    MOV AL,84H
    OR AL,20H
               
    MOV AX,4C00H
    INT 21H
 
code ends
end start ;

在这里插入图片描述
3. 使操作数不变,但影响6个状态标志位,并使CF=OF=0。

code segment
start:        
    MOV AL,3FH
    OR AL,AL
               
    MOV AX,4C00H
    INT 21H
 
code ends
end start ;

在这里插入图片描述

3. 逻辑“非”指令NOT

指令格式: NOT seg/mem
操作数: 单操作数
功能: 按位取反

3.1 NOT指令示例

如,将E4H按位取反
在这里插入图片描述
取反结果为1BH. 并且NOT对标志位无影响

4. 逻辑“异或”指令XOR

指令格式: XOR destination,source ;
功能: 将源操作数和目标操作数按位进行“异或”运算,结果送回目标操作数。
主要应用于:
(1)实现两操作数的异或运算
(2)将某一寄存器清零

4.1 XOR指令应用示例

  1. 实现两操作数的异或运算
    3344H 异或 1122H
code segment
start:        
    MOV AX,3344H
    XOR AX,1122H
               
    MOV AX,4C00H
    INT 21H
 
code ends
end start ;

运行结果:

在这里插入图片描述

  1. 将某一寄存器清零
    将寄存器AX清零
code segment
start:        
    MOV AX,3344H
    XOR AX,AX
               
    MOV AX,4C00H
    INT 21H
 
code ends
end start ;

运行结果:
在这里插入图片描述

5. 测试指令TEST

指令格式: TEST reg/mem
功能: 在不破坏目标操作数内容的情况下检测操作数中某些位是“1”还是“0”。
TEST AL,02H ;若AL中D1位为1,则ZF=0,否则ZF=1

5.1 TEST指令应用示例

在数据段中定义一个长32个字节的数组,并初始化数组。用TEST指令判断其中负数的个数。

DATA SEGMENT
ARRAY   DB  70H,71H,72H,73H,74H,75H,76H,77H,78H,79H,
        DB  7AH,7BH,7CH,7DH,7EH,7FH  
        DB  80H,81H,82H,83H,84H,85H,86H,87H,88H,89H,
        DB  8AH,8BH,8CH,8DH,8EH,8FH
DATA ENDS

ASSUME DS:DATA  CS:CODE
CODE SEGMENT
START:       
        MOV AX,DATA
        MOV DS,AX
        XOR DX,DX
        XOR AX,AX
        MOV SI,OFFSET ARRAY 
        MOV CX,20H
AGAIN:  MOV AL,[SI]
        INC SI
        TEST AL,80H   
        JZ NEXT
        INC DX
NEXT:   DEC CX
        JNZ AGAIN         
CODE ENDS
END START;

运行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值