分享

汇编(十一)——位操作类指令

 shamo9966 2015-09-29
操作类指令对二进制的各个位进行操作,包括逻辑运算指令和移位指令。

 

一、逻辑运算指令
逻辑运算指令用来对字或字节按位进行逻辑运算,包括逻辑与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标志的影响,循环移位指令与移位指令一样。

移位操作指令和循环移位操作指令示意图:

·SHL 逻辑左移指令
格式:SHL OPR, CNT
其中OPR可以是除立即数以外的任何寻址方式。移位次数由CNT决定,CNT可以是1或CL。CNT为1时只移一位,如需要移位的次数大于1,则可以在该移位指令前把移位次数置于CL寄存器中,而移位指令中的CNT写为CL即可。有关OPR及CNT的规定适用于以下的移位指令。


·SAL 算术左移指令

格式:SAL OPR,CNT
执行的操作:与SHL相同。

 
 

·SHR 逻辑右移指令 
格式:SHR OPR,CNT
  

 

·SAR 算术右移指令
格式:SAR OPR,CNT

 
 

这里最高有效位右移,同时再用它自身的值填入,即如原来是0则仍为0,原来是1则仍是为1。

 

·ROL 循环左移指令
格式:ROL OPR,CNT

  

 

·ROR 循环右移指令
格式:ROR OPR,CNT

  

 

·RCL 带进位循环左移指令

格式:RCL OPR,CNT

  

 

·RCR 带进位循环右移指令
格式:RCR OPR,CNT

 

  

    所有移位指令都可以作字或字节操作。它们对条件码的影响是: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。





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多