位操作类指令对二进制的各个位进行操作,包括逻辑运算指令和移位指令。
一、逻辑运算指令
逻辑运算指令用来对字或字节按位进行逻辑运算,包括逻辑与AND、逻辑或OR、逻辑非NOT、逻辑异或XOR和测试TEST五条指令。
1、逻辑与指令AND
AND dest,src ;des←dest∧src(符号∧表示逻辑与)
AND指令对两个操作数执行按位的逻辑与运算:即只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0。逻辑与的结果送到目的操作数。用AND指令可以将一个字节或字中的某些特定位清零,或者说将某些位截取下来。如将ASCII码的高4位清零,亦即截取低4位,假设这个ASCII码已在AL中,则AND AL,00001111B就会将AL中的低4位截取下来,将AL中的高4位清零。其中00001111B称为逻辑乘常数。AND指令及后面介绍的其他双操作数逻辑指令OR、XOR和TEST,源操作数可以是任意寻址方式,而目的操作数只能是立即数之外的其他寻址方式,并且两个操作数不能同时为存储器寻址方式。所有双操作数的逻辑指令均设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。
2、测试指令TEST
TEST dest,src ;dest∧src(符号∧表示逻辑与)
TEST指令对两个操作数执行按位的逻辑与运算,但结果不回送目的操作数。TEST指令执行的操作与AND相同,但不保存执行结果,只根据结果来设置状态标志。TEST指令通常用于检测一些条件是否满足,但又不希望改变源操作数的情况,这条指令之后,一般都是条件转移指令,目的是利用测试条件转向不同的程序段。
3、逻辑或指令OR
OR dest,src
OR指令对两个操作数执行按位的逻辑或运算:即只要相“或”的两位有一位是1,结果就是1。OR指令可用于置位某些位。
4、逻辑异或指令XOR
XOR dest,src
相异或的两位不相同时,结果就是1,否则,异或的结果为0。XOR可用于求反某些位,要求求反的位同“1”异或,维持不变的位同“0”异或。XOR指令经常给寄存器清0,同时使CF也清零。
xor ax,ax ;ax=0,CF=OF=0,SF=0,ZF=1,PF=1
5、逻辑非指令NOT
NOT reg/mem ;reg/mem←~reg/mem(~表示逻辑反)
NOT指令对操作数按位求反,NOT指令是一个单操作数指令,操作数可以是立即数以外的任何寻址方式。NOT指令不影响标志位。
二、移位指令
1、逻辑移位指令SHL和SHR
SHL reg/mem,1/CL ;逻辑左移:reg/mem左移1/CL位,最低位补0,最高位进入CF
SHR reg/mem,1/CL ;逻辑右移:reg/mem右移1/CL位,最高位补0,最低位进入CF
2、算术移位指令SAL和SAR
SAL reg/mem,1/CL ;算术左移,功能与SHL相同
SAR reg/mem,1/CL ;算术右移:reg/mem右移1/CL位,最高位不变,最低位进入CF
移位指令按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF,对AF没有定义。如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF=1;否则OF=0。当移位次数大于1时,OF不确定。
逻辑左移指令SHL执行一次移位,相当于无符号数的乘2;逻辑右移指令SHR执行一位移位,相当于无符号数除以2,商在目的操作数中,余数由CF标志反映。算术右移指令SAR执行一次移位,相当于有符号数除以2。但应注意,当操作数为负(最高位为1),并且最低位有1移出时,SAR指令产生的结果与IDIV指令的结果不同。
三、循环移位指令
循环移位指令类似移位指令,但要从一端移出的位返回到另一端形成循环。分成不带进位标志循环和带进位标志循环。
1、不带进位标志循环指令ROL和ROR
ROL reg/mem,1/CL ;不带进位循环左移
ROR reg/mem,1/CL ;不带进位循环右移
2、带进位循环移位指令RCL和RCR
RCL reg/mem,1/CL ;带进位循环左移
RCR reg/mem,1/CL ;带进位循环右移
循环移位指令按照指令功能设置进位标志CF,不影响SF、ZF、PF、AF标志。对OF标志的影响,循环移位指令与移位指令一样。