知识点
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指令应用示例
-
实现来操作数按位相“与”
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
- 使目标操作数中某些位保持不变,把其他位清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指令应用示例
- 实现两操作数按位相“或”
34 "与“ 56 = 0011 0100 或 0101 0110 = 0111 0110 = 76H
- 使目标操作数某些位不变,将另一些位置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指令应用示例
- 实现两操作数的异或运算
3344H 异或 1122H
code segment
start:
MOV AX,3344H
XOR AX,1122H
MOV AX,4C00H
INT 21H
code ends
end start ;
运行结果:
- 将某一寄存器清零
将寄存器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;
运行结果: