当需要对字节或字数据中的各个二进制位进行操作时,可以考虑采用二进制位操作类指令。
一、逻辑运算类指令AND、OR、NOT、XOR、TEST
逻辑运算方法
1、逻辑与指令AND
指令格式:AND dst, src
执行操作:dst<——dst∧src;∧为按位做逻辑“与”运算
标志位:CF、OF复位,而SF、PF、ZF有操作结果决定
指令功能:两个操作数的对应位都为 1 时,结果为 1,否则为 0(有0为0)。运算结果送回到目的操作数。
2、逻辑或指令OR
指令格式:OR dst, src
执行操作:dst<——dst∨src;∨为按位做逻辑“或”运算
标志位:CF、OF复位,而SF、PF、ZF有操作结果决定
指令功能:两个操作数的对应位都为 0 时,结果为 0,否则为 1(有1为1)。运算结果送回到目的操作数。
3、逻辑非指令NOT
指令格式:NOT dst
执行操作:dst<——~dst
标志位:不影响
指令功能:将指定寄存器或存储单元的内容按位取反。运算结果送回到目的操作数。
4、逻辑或指令XOR
指令格式:XOR dst, src
执行操作:dst<——dst⊕ src;
标志位:CF、OF复位,而SF、PF、ZF有操作结果决定
指令功能:两个操作数的对应位不相同为 1,相同为 0。运算结果送回到目的操作数。
5、逻辑或指令TEST
指令格式:TEST dst, src
执行操作:dst∧src;
标志位:CF、OF复位,而SF、PF、ZF有操作结果决定
指令功能:两个操作数的对应位都为 1 时,结果为 1,否则为 0(有0为0)。运算结果不会送回到目的操作数。
实际应用:
AND指令用于对一个数据的指定位清零 (与上0,有0为0)
OR指令用于对一个数据的指定位置1 (或上1,有1为1)
NOT指令用于取反码,再加一,得补码 (取反)
XOR指令用于对寄存器清零 (异或本身,一样置0)
TEST指令用于测试一个数据的指定位是1还是0 (与上0,有0为0)
二、非循环移位指令SHL、SHR、SAL、SAR
如果只移一位,指令中用1指出移位的位数,如果超过1位,必须用CL预先指明移位的位数。
1、(非循环)逻辑左移指令SHL(Shift logical Left)
指令格式:SHL dst, CL(SHL dts, 1)
标志位:SF、ZF、PF根据以为结果置位
指令功能:将操作数左移,由 CL 指定移位位数,最高位移入进位标志 CF,移动后空出的最低位补 0。
2、(非循环)逻辑右移指令SHR(Shift logical Right)
指令格式:SHR dst, CL(SHR dts, 1)
标志位:SF、ZF、PF根据以为结果置位
指令功能:将操作数右移,由 CL 指定移位位数,最低位移入进位标志 CF,移动后空出的最高位补 0。
3、(非循环)算数左移指令SAL(Shift Arithmetic Left)
指令格式:SAL dst, CL(SAL dts, 1)
标志位:SF、ZF、PF根据以为结果置位
指令功能:将操作数左移,由 CL 指定移位位数,最高位移入进位标志 CF,移动后空出的最低位补 0。
4、(非循环)算术右移指令SAR(Shift Arithmetic Right)
指令格式:SAR dst, CL(SAR dts, 1)
标志位:SF、ZF、PF根据以为结果置位,当只移一位时影响OF。
指令功能:将操作数右移,由 CL 指定移位位数,最低位移入进位标志 CF,移动后符号位不变(即最高位自动用最高位补充)。
逻辑移位指令处理无符号数,算术移位指令处理有符号数。
示意图:
三、循环移位指令ROL、ROR、RCL、RCR
如果只移一位,指令中用1指出移位的位数,如果超过1位,必须用CL预先指明移位的位数。
1、循环左移指令ROL(Rotate Left)
指令格式:ROL dst, CL (ROL dst, 1)
标志位:该指令只影响CF、OF标志
指令功能:将操作数左移,由 CL 指定移位位数,最高位移入进位标志 CF,同时最高位移入最低位,形成环路。
2、循环右移指令ROL(Rotate Right)
指令格式:ROR dst, CL (ROR dst, 1)
标志位:该指令只影响CF、OF标志
指令功能:将操作数右移,由 CL 指定移位位数,最低位移入进位标志 CF,同时最低位移入最高位,形成环路。
3、带进位循环左移指令RCL(Rotate Left through Carry)
指令格式:RCL dst, CL (RCL dst, 1)
标志位:该指令只影响CF、OF标志
指令功能:将操作数左移,由 CL 指定移位位数,最高位移入进位标志 CF,CF 移入最低位,形成环路。
4、循环左移指令RCR(Rotate Right through Carry)
指令格式:RCR dst, CL (RCR dst, 1)
标志位:该指令只影响CF、OF标志
指令功能:将操作数右移,由 CL 指定移位位数,最低位移入进位标志 CF,CF 移入最高位,形成环路。
示意图: