您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《计算机组成原理与汇编语言》 > 第3章 指令系统与汇编语言设计

第4节 逻辑运算和移位指令

3.4.1 逻辑运算和移位指令

      1.逻辑运算指令

       (1)NOT OPRD

该指令对操作数进行求反操作,然后将结果送回。操作数可以是寄存器或贮器的内容。该指令对标志位不产生影响。

        例如: NOT AL

     (2)AND指令

该指令对两个操作数进行按位相“与”的逻辑运算。即只有参加相与的两位全为“1”时,相“与”结果才为“1”;否则相“与”结果为“0”。相“与”结果送回。

AND指令可以进行字节操作,也可以进行字操作。

         AND指令的一般格式为

                     AND OPRD1,OPRD2
  
其中,目的操作数OPRD1可以是累加器,也可以是任一通用寄存器,可以是内存操作数。源操作数OPRD2可以是立即数、寄存器,也可以是内存操作数,

           例如:
 
               AND AL,0FH
               ANDAX,BX
               ANDSI,BP
               ANDAX,DATA --WORD
               ANDDX,BUFFER[SI+BX]
               ANDDATA --WORD,00FFH
               ANDBLOCK[BP+DI],DX

        (3) TEST指令

该指令的操作功能与AND指令相同,其结果将反映在标志位上,但结果不送回,即TEST指令将不改变操作数的值。这条指令通常是在不希望改变操作数的前提下,

用来检测某一位或某几位的状态。

             TEST 指令的一般格式为

                   TEST OPRD,im ;im是立即数

            立即数中哪一位为1,表示要对哪一位进行测试。

例如,若要检测AL中的最低位是否为1,且为1则转移。在这种情况下
        
            可以用如下指令:

               TEST AL, 01H
                JNZ THERE
         … THERE:MOV BL,05H

       (4) OR指令 

OR指令允许对字节或对字进行相“或”运算。OR指令使标志位CF=0,OF=0;相“或”操作的结果反映在标志位PF、SF和ZF上;对AF标志位未定义。
             
       OR指令的一般格式为
             OR OPRD1,OPRD2

其中,目的操作数OPRD1可以是累加器,可以是任一通用寄存器,也可以是一个内存操作数。源操作数OPRD2可以是立即数,也可以是寄存器,也可以是内存操作数,

              例如:

                 OR AL,30H
                 OR AX,00FFH
                 OR BX,SI
                 OR BX,DATA --WORD
                 OR BUFFER,SI
                 OR BUFFER[BX+SI],8000H

              操作数自身相“或”将不改变操作数的值,但可使进位标志位CF清0。
 
          (5) XOR指令

该指令对两个操作数进行按位“异或”操作,即进行“异或”操作的两位值不同时,其结果为“1”;否则就为0,操作结果送回。

                 XOR 指令的一般形式为

                                   XOR OPRD 1 ,OPRD2

其中,目的操作数OPRD1可以是累加器、任一个通用寄存器,也可以是一个内存操作数。源操作数可以是立即数、寄存器,也可以是内存操作数.
                    
                    例如: 
                         XOR AL,0FH
                         XOR AX,BX
                         XOR DX,SI
                         XOR CX,CONNT --WORD
                         XOR BUFFER,DI
                         XOR BUFFER[BX+SI],AX

当操作数自身进行“异或”时,由于每一位都相同,因此“异或”结果一定为0,且使进位标志位也为0。这是对操作数清0的常用方法。

                    例如:

                         XOR AX ,AX
                         XOR SI,SI

          2.移位指令

8088有3条移位指令。算术左移和逻辑左移指令:SAL/SHL OPRD,m ;m是移位次数,可以是1或寄存器CL中的内容算术右移指令:

                      SAR OPRD, m 

                 逻辑右移指令:SHR OPRD, m

             (1) SAL/SHL指令

这两条指令的操作结果是完全一样的。每移位一次在右面最低位补一个0,而左面的最高位则移入标志位CF,如图3.16所示。  

          (2) SAR指令

该指令每执行一次移位操作,就使操作数右移一位,但符号位保持不变,而最低位移至标志位CF,如图3.17所示。
             
             SAR可移位由m所指定的次数,结果影响标志位CF、OF、PF、SF和ZF。

 


                                     (3) SHR指令

该指令每执行一次移位操作,就使操作数右移一位,最低位移 至标志位CF中。与SAR不同的是,左面的最高位将补0,如图3.18所示。 该指令可以执行由m所指定的移

位次数。

 
          3. 循环移位指令

                  8088有4条循环移位指令:

                    左循环移位指令 ROLOPRD,m
                    
                 右循环移位指令 ROROPRD,m
                    
                 带进位左循环移位指令 RCLOPRD,m
                    
                 带进位右循环移位指令 RCROPRD,m

          (1) ROL指令

该指令每做一次移位,总是将最高位移入进位位CF中,并且还将最高位移入操作数的最低位,从而构成一个环,如图3.19(a)所示。

                  (2) ROR指令

该指令每做一次移位,总是将最低位移入进位标志位CF中,另外,还将最低位移入操作数的最高位,从而构成一个环,如图3.19(b)所示。 

  
   
       (3) RCL指令

该指令是把标志位CF包含在内的循环左移指令。每移位一次,操作数的最高位移入进位标志位CF中,而原来CF的内容则移入操作数的最低位,从而构成一个大环,

如图3.19(c)所示。

       (4)RCR指令

该指令是把进位标志位CF包含在内的右循环指令。每移位一次,标志位CF中的原内容就移入操作数的最高位,而操作数的最低位则移入标志位CF中,如图3.19(c)所示。

左移一位,只要左移以后的数未超出一个字节或一个字所能表达的范围,则相当于原来的数乘以2;而右移一位相当于除以2,
    
              例如:
 
                    MOV AL,08H
                 SALAL,1 ;左移一位,相当于乘以2;该指令执行后,AL中的内容为16
                 MOVAL,16
                 SARAL,1 ;右移一位,相当于除以2 ;该指令执行后,AL中的内容为8