逻辑指令包括逻辑运算指令和移位指令,逻辑运算指令提供对操作数进行按位逻辑运算的能力,而移位指令则实现将操作数左移或右移几位的操作。
1.逻辑运算指令
逻辑运算指令可以对字或字节执行逻辑运算。由于逻辑运算是按位操作的,因此一般说来,其操作数应该被视为位串而不是数。逻辑运算指令包括AND、OR、NOT、XOR、TEST几种。
●AND
格式:AND dst,src
执行的操作:(dst)←(dst)AND(src)
逻辑与指令,执行按位的逻辑与操作。
●OR
格式:OR dst,src
执行的操作:(dst)←(dst)OR(src)
逻辑或指令,执行按位的逻辑或操作。
●NOT
格式:NOT opr
执行的操作:(opr)←NOT(opr)
逻辑非操作,执行按位的逻辑非操作。
●XOR
格式:XOR dst,src
执行的操作:(dst)XOR(src)
逻辑异或操作,执行按位的逻辑异或操作。
●TEST
格式:TEST opr1,opr2
执行的操作:(opr1)AND(opr2)
测试指令,对两个操作数执行逻辑与操作,结果不保存,只根据其特征置条件码。
以上五种指令中,NOT不允许使用立即数,其他4条指令除非源操作数是立即数,至少有一个操作数必须存放在寄存器中,另一个操作数则可以使用任意寻址方式。它们对标志位的影响情况:NOT指令不影响标志位,其他4种指令将使CF和OF为0,AF位无定义,而SF、ZF和PF则根据运算结果设置。这些指令对处理操作数的某些位很有用,例如可屏蔽某些位(将这些位置0),或使某些位置1或测试某些位等。
例:
要求屏蔽0、1两位,可用AND指令并设置常数0FCH。
MOV AL,OBFH
AND AL,OFCH
这两条指令执行的结果使(AL)=0BCH。用AND指令可以使操作数某些位清0,其他位则保持不变。只需要把AND指令的源操作数设置为一个立即数,并把需要清0的位设为0,就可达到目的。
例:
要求第5位置1,可用OR指令。
MOV AL,OBFH
OR AL,OlOH
这两条指令执行后,(AL)=63H。用OR指令可以使操作数某些位置1,其他位则保持不变。只需要把OR指令的源操作数设置为一个立即数,并把需要置1的位设为1,就可达到目的。
例:
要测试操作数的某位是否为0,可用TEST指令,同样把TEST指令的源操作数设置为一个立即数,其中需要测试的位应设为1。
MOV AL,40H
TEST AL,OAFH
这里要求测试第0、1、2、3、5、7位是否为0,根据测试的结果设置条件码为CF=0F=0,SF=0,ZF=1,说明所需测试的位均为0。如果在这两条指令之后跟一条条件转移指令JNZ,如结果不是0则转移,如结果为0则顺序往下执行,这样就可根据测试的情况产生不同的程序分支,转向不同的处理。
例:
要测试操作数某位是否为1,可先把该操作数求反,然后用TEST指令测试。如果测试AL寄存器中第2位是否为1,如为1则转移到EXIT去执行,可用下列指令序列:
MOV DL AL
NOT DL
TEST DL,OOOO0100B
JE EXIT
如AL寄存器的内容为0FH,为避免破坏操作数的原始内容,把它复制到DL去测试,执行完TEST指令后,因结果为全0而有ZF=1,说明操作数的第2位为1,因而转移到EX- IT去执行。
例:
要使操作数的某些位变反可以使用XOR指令,只要把源操作数的立即数字段的相应位置1,就可以达到目的。如果要求第0、1位变后的情况,可使用如下指令:
MOV AL,ⅡH
XOR AL,3
(AL)=12H,达到第0、1位改变而其他位不变的目的。(www.xing528.com)
例:
XOR指令还可以用来测试某一操作数是否与另一确定的操作数相等,检查地址是否与另一确定的操作数相等、检查地址是否匹配时是常用的。
XOR AX,042EH
JZ MATCH
这两条指令用来检查AX的内容是否等于042EH,若相等则转到MATCH去执行匹配时要作的工作,否则执行JZ指令下面的程序。
2.移位指令
移位指令用来实现字或字节的按位移动,主要包括四类:逻辑移位、算术移位、循环移位和带进位循环移位。
●SHL
格式:SHL opr,cnt
执行的操作:逻辑左移指令,将操作数中的所有位向左(即高端)移动,最低位填入0,最高位移到CF标志位。其中opr可以是除立即数以外的任何寻址方式。移位次数由cnt决定,cnt可以是1或CL。cnt为1时只移一位,如需要移位的次数大于1,则可以在该移位指令前把移位次数置于CL寄存器中,而移位指令中的cnt写为CL即可。有关opr及cnt的规定适用于以下的移位指令。
●SHR
格式:SHR opr,cnt
执行的操作:逻辑右移指令,将操作数中的所有位向右(即低端)移动,最高位填入0,最低位移到CF标志位。
●SAL
格式:SAL opr,cnt
执行的操作:算术左移指令,执行的操作与SHL相同。
●SAR
格式:SAR opr,cnt
执行的操作:算术右移指令,将操作数中的所有位向右(即低端)移动,最低位移到CF标志位,最高有效位右移,同时再用它自身的值填入,即如原来是0则仍为0,原来是1则仍是为1,以保持符号位不变。
●ROL
格式:ROL opr,cnt
执行的操作:循环左移指令,将操作数中的所有位向左(即高端)移动,并将最高位移到最低位(循环)和CF标志位。
●ROR
格式:ROR opr,cnt
执行的操作:循环右移指令,将操作数中的所有位向右(即低端)移动,并将最低位移到最高位(循环)和CF标志位。
●RCL
格式:RCL opr,cnt
执行的操作:带进位循环左移指令,将操作数中的所有位向左(即高端)移动,并将最高位移到CF标志位,将原CF标志位移到最低位。
●RCR
格式:RCR opr,cnt
执行的操作:带进位循环右移指令,将操作数中的所有位向右(即低端)移动,并将最低位移到CF标志位,将原CF标志位移到最高位。
所有移位指令都可以作字或字节操作。它们对条件码的影响是:CF位根据各条指令的规定设置。OF位只有当cnt=1时才是有效的,在移位后最高有效位的值发生变化时(原来为0,移位后为1,或原来为1,移位后为0)OF位置1,否则置0。循环移位指令不影响除CF和OF以外的其他条件标志。而移位指令则根据移位后的结果设置SF、ZF和PF位,AF位则无定义。
可以看出,这八种指令可以分为两组:前四种为移位指令,后四种为循环移位指令。移位指令则常常用来做乘以2或除以2的操作。其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2,而逻辑移位指令则用于无符号数运算,SHL用来乘2,SHR用来除以2。循环移位指令可以改变操作数中所有位的位置,在程序中是很有用的。需要注意的是,移位指令的执行速度远远比乘法、除法指令要快得多,所以,用移位指令,以及移位指令与其他指令的组合来替代乘法或除法指令可以获得非常高的性能增益。
图3-6表示这八种移位指令所执行的操作。
图3-6 移位指令所执行的操作
例:
MOV CL,5
SAR[DI],CL
如果指令执行前,(DS)=0F800H,(DI)=180AH,(0F980A)=0064H,则指令执行后,(0F980A)=0003H,CF=0,相当于100/32=3(整数除法)。
例:
MOV CL,2
SHL SI,CL
如指令执行前,(SI)=1450H,则指令执行后,(SI)=5140H,CF=0,相当于5200×4=20800
例:
如(AX)=0012H,(BX)=0034H,要求把它们装配在一起形成(AX)=1234H,可编制如下程序片断:
MOV CL,8
ROL AX,CL
ADD AX,BX
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。