目录
如名字所示,为操作类指令对二进制数的各类进行操作,包括逻辑运算指令和移位指令。
一、逻辑运算类指令
8086汇编语言的逻辑运算类指令主要包括常见的逻辑指令AND,OR,NOT,XOR和一个测试指令TEST。
逻辑与指令AND
操作:对两个操作数执行按位的逻辑与计算,逻辑与的结果送目的操作数。其基本格式如下:
AND reg,imm/reg/mem
AND mem,imm/reg
AND指令常用于复位目的地址的某些位,通过将这些位与0取逻辑与运算得到。例如,在标志寄存器的某些标志操作一节所提到的栈操作。
寻址方式:和其他双操作数的寻址方式一样,目的操作数不能是立即数,而且两个操作数不能同时为存储器寻址。
标志影响:双操作数的逻辑指令统一设置OF=CF=0,根据实际结果设置SF,ZF和PF,但是对AF无定义。
逻辑或指令OR
操作:对两个操作数执行按位的逻辑或计算,逻辑与的结果送目的操作数。其基本格式如下:
OR reg,imm/reg/mem
OR mem,imm/reg
OR指令和AND指令相对,常用来置位目的地址的某些位。
寻址方式:和AND指令相同。
标志影响:和AND指令相同。
逻辑异或指令XOR
操作:对两个操作数执行按位的逻辑异或计算,逻辑与的结果送目的操作数。其基本格式如下:
XOR reg,imm/reg/mem
XOR mem,imm/reg
XOR指令常用来求反某些位,通过将需要求反的位与1异或,不需要求反的与0异或。
寻址方式:和AND指令相同。
标志影响:和AND指令相同。
逻辑非指令NOT
操作:对操作数的所有位按位取反。其基本格式如下:
NOT reg/mem
寻址方式:不可以是立即数寻址。
标志影响:无。
测试指令TEST
操作:对两个操作数执行按位的逻辑与运算,但是结果不返回目的操作数,只根据结果设置一些状态标志。TEST标志后方一般跟随一些条件转移指令(下一节),利用测试条件转向不同的程序段。
寻址方式:与AND相同。
标志影响:与AND相同。
下面是一个使用TEST指令的例子。
TEST AL,01H ;测试AL的最低位D0
JNZ there ;若ZF=0,程序转移到there
... ;ZF=1,程序顺序执行
there: ;
二、移位指令
移位指令分为逻辑移位指令和算术移位指令,每一种又分别具有左移和右移两种操作。
逻辑移位指令
操作:左(右)移动位,最低(高)位补0。其基本格式如下:
SHL reg/mem,1/cl ;左移1或者cl位
SHR reg/mem,1/cl ;右移1或者cl位
当移位位数大于1时,使用CL寄存器表示,该操作数表达为CL。
寻址方式:和其他单操作数指令相同,不可以是立即数寻址。
标志影响:被移除的最高(低)位进入CF,并且根据移位后的结果影响SF,ZF,PF,但是对AF没有定义。如果只移动1位时,根据最高位符号位的改变情况设定OF。
算术移位指令
操作:左(右)移动位,左移时,最低位补0;右移时,最高位不变。其基本格式如下:
SAL reg/mem,1/cl ;和SHL有相同作用
SAR reg/mem,1/cl ;执行右移,但是最高位不变
算术右移指令SAR执行一位移位,相当于有符号数除以2.
注意,当操作数为负且最低位有1移出时,SAR指令产生的结果与等效的IDIV指令的结果不同。例如,-5(FBH)经过SAR右移移位等于-3(FDH)而IDIV执行的结果为-2.
三、循环移位指令
当进行移位指令时,位于边缘的位会被移出或者计入CF;但是在循环移位指令中,从一端移出的位返回到另一端形成循环。循环移位指令分为不带进位循环移位和带进位循环移位。其基本格式如下:
ROL reg/mem,1/cl
ROR reg/mem,1/cl
RCL reg/mem,1/cl
RCR reg/mem,1/cl
前两条指令不添加CF进位。后两条指令将CF和操作数组合成9/17位进行移位。
寻址方式:和其他单操作数指令相同。
标志影响:根据指令功能设置CF,不影响SF,ZF,PF,AF标志。对OF的影响和移位指令一样。
总结
位操作类指令包含部分位的操作AND、OR、XOR以及全体位的操作指令NOT、SHL(R)、SAL(R)、ROL(R)、RCL(R)。这些指令对于标志的影响可能有时候会影响下方指令的操作,而且需要注意SAR和IDIV的区别,RO和RC指令的不同之处。在位操作中出现的独特CL寄存器也值得我们去关注其工作原理。