本节内容:逻辑运算指令。8086 CPU逻辑运算指令包括NOT、AND、OR、XOR,除NOT指令外,均有两个操作数。逻辑运算指令影响状态标志位。
■否操作指令NOT指令格式:NOT OPRD。将OPRD取反,然后送回OPRD。操作数可以是8位/16位寄存器或内存操作数,不可以是立即数操作数。
■与操作指令AND指令格式:AND OPRD1,OPRD2。对两个操作数进行按位“与”运算,结果送入目的操作数OPRD1。操作数可以是8位/16位寄存器操作数或内存操作数。OPRD2为立即数时,称为掩码。OPRD1不可以为立即数。
■或运算指令OR指令格式:OR OPRD1,OPRD2。对两个操作数进行按位的逻辑“或”运算,结果送入OPRD1。操作数可以是8位/16位寄存器操作数或内存操作数。OPRD2为立即数时,称为掩码。OPRD1不可以为立即数。
■异或操作指令XOR指令格式:XOR OPRD1,OPRD2。两个操作数按位进行“异或”运算,结果送入OPRD1。操作数可以是8位/16位寄存器操作数或内存操作数,不可以是立即数。如果操作自己与自己进行异或运算,则结果为0,CF=0。
■测试指令TEST指令格式:TEST OPRD1,OPRD2。TEST指令与AND指令类似,两个操作数按位进行“与”操作,但是结果不送入OPRD1,仅仅影响标志位。
注意
1.如果指令有两个操作数,最多只能有一个操作数为存储器;
2.只有通用寄存器或存储器操作数可作为目的操作数,用于存放运算结果;
3.如果只有一个操作数,则该操作数既是源操作数也是目的操作数;
4.操作数可以是字节,也可以是字,如果是两个操作数,类型必须一致;
5.对于存储器操作数可采用[BX+SI+位移量]四种寻址方式;
接下来,我们分别介绍逻辑运算指令的用法。
8.4.1 否操作指令NOT
■指令格式:NOT OPRD
将OPRD取反,然后送回OPRD。操作数可以是8位/16位寄存器或内存操作数,不可以是立即数操作数。
NOT AX
NOT VARW ;字变量
NOT AL
NOT BYTE PTR VARB;字节变量
动手实验43:否操作指令NOT
如图8-22所示,在debug调试器内输入如下一组汇编指令,注意观察AX值的变化:
mov al,1 ;al=0000 0001B
not al ;al=1111 1110B
mov ax,2 ;ax = 0000 0000 0000 0010B
not ax ;ax = 1111 1111 1111 1101B
图8-22 NOT指令
8.4.2 与操作指令AND
■指令格式:AND OPRD1,OPRD2
对两个操作数进行按位“与”运算,结果送入目的操作数OPRD1。操作数可以是8位/16位寄存器操作数或内存操作数。OPRD2为立即数时,称为掩码。OPRD1不可以为立即数。
例:
AND AL,0DFH ;将al寄存器第5位清零
AND DH,0DH ;操作数自己和自己做“与”运算,值不变,但是CF清0。
AND AX,ES:[SI] ;AX寄存器与内存操作数ES:[SI]按位与运算。
■对标志位的影响
该指令执行后,CF=0,OF=0,PF,ZF,SF反映运算结果,AF未定义。
AND操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位清0的场合。
动手实验44:与操作指令AND
如图8-23所示,在debug调试器内输入如下一组汇编指令,注意观察标志位的变化:
MOV AL,34H ;AL=34H
AND AL,0FH ;AL=04H,将AL的高4位清零
图8-23 AND指令
8.4.3 或运算指令OR
■指令格式:OR OPRD1,OPRD2
对两个操作数进行按位的逻辑“或”运算,结果送入OPRD1。操作数可以是8位/16位寄存器操作数或内存操作数。OPRD2为立即数时,称为掩码。OPRD1不可以为立即数。
例:
OR AX,8080H ;将AX寄存器的第7位和第15位置1
OR CL,AL ;将CL和AL寄存器按位或运算
OR WORD PTR [BX-3],AX ; 将内存操作数DS:[BX-3]和AX寄存器按位或运算
OR DH,DH ;操作数与自己本身进行或运算,值不变,但CF清0。
■对标志位的影响
OR指令执行后,CF=0,0F=0,标志PF,ZF,SF反映运算结果,标志AF未定义。
OR指令主要用于使一个操作数不变,而另外若干位置1的场合。
动手实验45:或运算指令OR
如图8-24所示,在debug调试器内输入如下一组汇编指令,注意观察标志位的变化:
MOV AL,41H ;AL=01000001B
OR AL,20 H ;AL=01100001B
图8-24 OR指令
8.4.4 异或操作指令XOR
■指令格式:XOR OPRD1,OPRD2
两个操作数按位进行“异或”运算,结果送入OPRD1。操作数可以是8位/16位寄存器操作数或内存操作数,目的操作数不可以是立即数。
如果操作自己与自己进行异或运算,则结果为0,CF=0。
XOR DX,DX ;DX=0,CF=0
XOR异或操作指令主要用于是一个操作数若干位维持不变,而另外若干位取反场合。
动手实验46:异或运算指令XOR
图8-25 XOR指令
如图8-25所示,在debug调试器内输入如下一组汇编指令,注意观察标志位的变化:
MOV AL,34H ;AL=00110100B
XOR AL,0FH ;AL=00111011B
8.4.5 测试指令TEST
■指令格式:TEST OPRD1,OPRD2
TEST指令与AND指令类似,两个操作数按位进行“与”操作,但是结果不送入OPRD1,仅仅影响标志位。
■对标志位的影响
TEST指令执行后,标志ZF,PF,SF反映运算结果,标志CF,OF被清零。
TEST通常用于检测某些位是否为1,但又不希望改变原操作数的值的场合。
动手实验47:测试指令TEST
如图8-26所示,在debug调试器内输入如下一组汇编指令,注意观察标志位的变化:
检查AL中的位6和位2是否有一位为1:
MOV AL,1
TEST AL,01000100B ;如果位6和位2全部为0,则ZF=1,否则ZF=0。
MOV AL,2
TEST AL, 01000100B
图8-26 TEST指令