分享

移位

 昵称1191095 2010-04-13

3.3.3 逻辑运算与移位指令
  1.逻辑运算指令

  逻辑运算是对操作数按位进行操作的,位与位之间无进位或借位,无数的正负与数的数值大小,这种运算的操作数称为逻辑数或逻辑值。
  逻辑运算指令有"与"、"或"、"非"、"异或"、"测试"5种。除了"非"指令的执行结果对标志位无影响外,其他指令执行后,总是使OF=CF=0,SF、ZF和PF根据运算结果置位或复位,以反映操作结果的特征,而AF状态不定。
  (1)逻辑"与"指令
  符号指令:AND DST,SRC
  指令功能:目的操作数和源操作数按位进行"与"运算,结果送回目的操作数,即

  DST(DST)∧(SRC)。"与"指令可用于将字或字节中的特定位清零。
源操作数可以是8/16位通用寄存器、存储器操作数或立即数;目标操作数只允许是通用寄存器或存储器操作数,且两者不能同时为存储器操作数。
  (2)逻辑"或"指令
  符号指令: OR DST,SRC
  指令功能:目的操作数和源操作数按位进行"或"运算,结果送回目的操作数,即
  DST (DST)∨(SRC)。源操作数与目的操作数的约定与AND指令相同,"或"指令用于将字或字节中的特定位置位。
  (3)逻辑"异或"指令
  符号指令:XOR DST ,SRC
  指令功能:目的操作数和源操作数进行"异或"运算,结果送回目的操作数,即
  DST (DST)⊕(SRC)。"异或"指令可用于将字节或字中特定位取反。源操作数与目的操作数的约定与AND指令相同。
  (4)逻辑"非"指令
  符号指令:NOT DST
  指令功能:目的操作数的各位求反码,结果送回目的操作数,即DST
(DST)
  (5)"测试"指令
  符号指令:TEST DTS,SRC
  指令功能:TEST是测试指令,它执行两个操作数(字节或字)的逻辑与操作。指令执行后,两个操作数均不发生变化,"与"的结果仅影响标志位。
  利用TEST指令,可以改变程序的执行方向。若在TEST指令之后,紧接着用一条条件转移指令JNE,则只要在两个操作数中有一对相应位的"与"结果是1,就发生程序转移。
       TEST AL,01H
  执行指令后,若ZF=0,则表示AL最低位为1;若ZF=1,则AL最低位为0。
  2.移位指令
  移位指令分为算术移位和逻辑移位。算术移位是对带符号数进行移位,在移位过程中必须保持符号位不变;而逻辑移位是对无符号数移位,总是用"0"来填补已空出的位。根据移位操作的结果置标志寄存器中的状态标志(AF标志除外)。若移位位数是1位,移位结果使最高位(符号位)发生变化,则将溢出标志OF置"1";若移多位,则OF标志将无效。
  (1)逻辑移位
  移位指令分为算术移位和逻辑移位。算术移位是对带符号数进行移位,在移位过程中必须保持符号位不变;而逻辑移位是对无符号数移位,总是用"0"来填补已空出的位。根据移位操作的结果置标志寄存器中的状态标志(AF标志除外)。若移位位数是1位,移位结果使最高位(符号位)发生变化,则将溢出标志OF置"1";若移多位,则OF标志将无效
  符号指令:SHL DTS,COUNT
       SHR DTS,COUNT
  指令功能:SHL是逻辑左移指令。逻辑左移是将目的操作数中的每一位向左移一位,最高有效位MSB移入进位标志位中,而CF原有的值丢失,空出的最低位补"0",如图3-21所示。逻辑左移指令用于无符号数乘以2,移入进位标志位的值可用来检查是否超位。
图3-21中,MSB是最高有效位,LSB是最低有效位。
  SHR是逻辑右移指令。逻辑右移是将目的操作数中的每一位向右移一位,操作数最低有效位LSB移入进位标志位CF,而CF原有的值丢失,空出的最高位补"0",如图3-22所示。逻辑右移指令用于无符号数除以2,移入进位标志位的值可用来检查数的奇偶性。

   
  同逻辑运算指令的操作数一样,目的操作数只允许是8/16位通用寄存器或存储器操作数。指令中的计数值(COUNT),可以是1,也可以是n(n≤255)。若移1位,指令的计数值字段直接写1;若移n位时,则必须将n 事先装入CL寄存器中,故计数值字段只能书写CL,而不能用立即数n。
  (2)算术移位指令
  符号指令: SAL DTS ,COUNT
        SAR DTS ,COUNT
  指令功能:SAL是算术左移位指令,它与逻辑左移指令SHL具有完全相同的操作、完全相同的编码形式。它们可以互换,它们是同一条指令的两个符号。SHL/SAL指令不仅适用于无符号数乘以2的运算,同样也适用于有符号数乘以2的运算。
  SAR是算术右移位指令,它将目的操作数中的每一位向右移一位,空出的最高位MSB原来最高位的值,使符号位保持不变。操作数最低位LSB移入进位标志位CF,而CF原来的值丢失。其操作如图3-23所示。
     
  算术右移位指令适用于有符号数除以2的运算。

  注意:若①中AL的内容当作无符号数时,则是240。当AL的内容算术左移一位后,应为480,结果超出了8位无符号数的范围。

  3.循环移位指令(java动画演示)
  所谓循环移位,是指将目的操作数一端移出来的位,移至目的操作数的另一端。所以,循环移位是一种将目的操作数首尾相连接的移位,从目的操作数移出来的位不会丢失。
  循环移位可分为不带进位位与带进位位循环移位。这类指令只影响CF和OF标志。CF标志总是保持移出的最后一位状态。若只循环移1位,且使最高位发生变化,则OF标志置"1";若循环移多位,则OF标志无效。
  (1) 不带进位位循环移位指令
  符号指令:ROL DTS ,COUNT
       ROR DTS ,COUNT
  指令功能:ROL是循环左移位指令。它将目的操作数中的每一位向左移动一位,最高位MSB移入最低位LSB,同时把最高位移入CF,而CF原有值丢失。其执行过程如图3-24所示。
  ROR是循环右移位指令,循环右移与循环左移位类似,只是将目的操作数向右移位,最低位移入最高位,同时把最低位移入CF。而CF原有值丢失。其执行过程如图3-25所示。
  
  (2)带进位位循环移位指令
  符号指令:RCL DST ,COUNT
       RCR DST ,COUNT
  指令功能:RCL是带进位标志位CF的循环左移指令。它将目的操作数连同进位标志一起循环左移,CF的值进入目的操作数最低位,而目的操作数的最高位进入CF。其操作过程如图3-26所示。
  RCR是带进位标志位CF的循环右移位指令。除了循环移位方向与RCL指令相反之外,其他功能与RCL类似。其操作过程如图3-27所示
  
  通常,移位与循环移位指令用来重定数据格式,也可用于按位检查寄存器或存储器单元的内容(移至进位标志CF中检查)。此外,利用这类指令,可以把一个寄存器的内容移至另一个寄存器中。
  总之,循环移位指令经常用于检查进位标志位CF、某个寄存器或存储器单元的内容,而又不希望这些内容被破坏的场合。
  执行算术右移指令将AX的最低位移入CF,再执行带进位循环右移指令,又把CF的值移入到BX的最高位,通过CF实现32位二进制数算术右移一位,如图3-28所示。
(JAVA动画图说明)
  

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多