8088/8086提供的逻辑运算指令共有5条:AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR(逻辑异或)及TEST(测试)指令。
操作数: 8位或16位寄存器或存储单元
功能: 按位操作
对标志位的影响: 除NOT外,都会使CF=OF=0,AF值不定,并对SF、PF和ZF有影响。NOT指令对所有标志位都不影响。
指令格式: AND destination,source ;
功能: 使源操作数和目标操作数按位相“与”,结果送回目标操作数中。
主要应用于:
(1)实现两操作数按位相“与”
(2)使目标操作数中某些位保持不变,把其他位清0.
(3)使操作数不变。但影响6个状态标志位,并使CF=OF=0.
实现来操作数按位相“与”
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
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 ;
指令格式: OR destination,source ;
功能: 实现对源操作数和目标操作数按位相“或”,结果送回目标操作数中。
主要应用于:
(1)实现两操作数按位相“或”
(2)使目标操作数某些位不变,将另一些位置1
(3)使操作数不变,但影响6个状态标志位,并使CF=OF=0。
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 ;
指令格式: NOT seg/mem
操作数: 单操作数
功能: 按位取反
如,将E4H按位取反
取反结果为1BH. 并且NOT对标志位无影响
指令格式: XOR destination,source ;
功能: 将源操作数和目标操作数按位进行“异或”运算,结果送回目标操作数。
主要应用于:
(1)实现两操作数的异或运算
(2)将某一寄存器清零
code segment
start:
MOV AX,3344H
XOR AX,1122H
MOV AX,4C00H
INT 21H
code ends
end start ;
运行结果:
code segment
start:
MOV AX,3344H
XOR AX,AX
MOV AX,4C00H
INT 21H
code ends
end start ;
指令格式: TEST reg/mem
功能: 在不破坏目标操作数内容的情况下检测操作数中某些位是“1”还是“0”。
TEST AL,02H ;若AL中D1位为1,则ZF=0,否则ZF=1
在数据段中定义一个长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;