位操作指令小結

1.邏輯運算指令

8086/8088指令系統的邏輯運算指令有“與”(AND)、“測試”(TEST)、“或”(OR)、“異或”(XOR)和“非”(NOT)五條。

除了“非”指令對狀態標誌位不產生影響外,其餘四條指令對狀態標誌位均有影響。這些指令將根據各自邏輯運算的結果影響SF、ZF和PF狀態標誌位,同時將CF和OF置“0”,但AF的值不確定。

    (1)邏輯“與”指令

    指令格式  AND  DST,SRC

        能:  DST←DST∧SRC

操作說明:  AND指令將目的操作數和源操作數按位進行邏輯“與”運算(即相“與”的兩位均爲1時結果爲1,否則爲0),將結果送回目的操作數。指令中目的操作數可以是寄存器或存儲器,源操作數可以是立即數、寄存器或存儲器。但是指令的兩個操作數不能同時是存儲器。

    用: AND指令可以有選擇地屏蔽某些位(有選擇地清0),而保留另一些位不變。

【例2.32】  AND  AL,3CH           ;8位二進制分別進行與運算

AND  AX,BX             ;16位二進制分別進行與運算

AND  DX,BUFFER[SI]

AND  [DI],CX

【例2.33】  MOV  AL,1011010lB    ;AL=1OllOl01B

AND  AL,0FH            ;AL=00000101B,保留低四位,高四位清0

    (2)測試指令

    指令格式:  TEST  DST,SRC

          DST ∧ SRC

    操作說明:  TEST指令將目的操作數和源操作數按位進行邏輯“與”運算,但邏輯運算的結果不送回目的操作數,即僅做DST∧SRC運算,兩個操作數的內容均保持不變,但運算結果影響狀態標誌位。

        用:TEST指令常常用於位測試,它與條件轉移指令一起,共同完成對特定位狀態的判斷,並實現相應的程序轉移。

    例2.34】 測試AL的最高位是否爲零,若不爲零,則轉移到NEXT。

TEST    AL,10000000B

JNZ    NEXT

                 

    NEXT:  ……

    (3)邏輯“或”指令

    指令格式:  OR DST,SRC

        能:  DST←DST∨SRC

    操作說明:  將目的操作數和源操作數按位進行邏輯“或”運算(即相“或”的兩位中任一位爲1時結果爲1,只有兩位都爲0時結果才爲0),並將結果送回目的操作數。

        用:  OR指令操作數的類型與AND指令相同。OR指令可將寄存器或存儲器中的某些特定的位設置成“1”,同時使其餘位保持原來的狀態不變。

    例2.35  若將AL寄存器的最高位置“1” ,而保持其餘位不變時,可用如下指令:

           OR  AL,10000000B        ;AL←AL∨(10000000B)

    (4)邏輯“異或”指令

    指令格式:  XOR  DST,SRC

        能:  DST←DST⊕SRC

    操作說明:  XOR指令將目的操作數和源操作數按位進行邏輯“異或”運算(即相“異或”的兩位數不相同時結果爲“1”,相同時則爲“0”),並將結果送回目的操作數。XOR指令操作數的類型與AND、OR指令均相同。

    用: XOR指令可將寄存器或存儲器中的某些特定的位“求反”,而使其餘位保持不變。XOR指令的另一個用途是將寄存器的內容清0。XOR指令和AND、OR等指令一樣,也會將進位標誌CF清0。

    例2.36  使AL寄存器中的第1、3、5、7位求反,第0、2、4、6位保持不變,可將AL和10101010B(即OAAH)“異或”。

           MOV  AL,0FH          ;AL=0FH

           XOR  AL,10101010B    ;AL=1O1OOl01B(0A5H)

2.37  XOR  AX,AX    ;將AX清0,同時將CF清0

   (5)邏輯“非”運算

指令格式:  NOT  DST

    能:  DST←

    操作說明:  NOT指令使目的操作數按位取反,即其中所有“0”的位變爲“1”,所有“1”的位變爲“0”。其操作數可以是8位或16位的寄存器或存儲器,但不能對立即數執行邏輯“非”操作。

    例2.38NOT  AH

NOT  WORD  PTR[BX][DI]

2.移位指令

8086/8088指令系統的移位指令可以向左或向右移位,移位次數由COUNT決定,COUNT爲1時移動一位,可直接寫於指令中。要求移多位時,移動位數必須事先放在CL寄存器中。移位指令影響除AF外的其他狀態標誌位。

    (1)邏輯左移指令

指令格式: SHL DST,COUNT                         

    操作說明:SHL指令將目的操作數順序向左移1位或移CL寄存器中指定的位數。左移1位時,操作數的最高位MSB移入進位標誌CF,最低位LSB補0,相當於無符號數乘上2。

    例2.39MOV  AH,8BH

MOV  CL,3

SHL  AH,CL     ;SI內容左移3位

    (2)邏輯右移指令

    指令格式:    SHR  DST,COUNT

操作說明  SHR將目的操作數順序向右移1位或移CL寄存器中指定的位數。低位移入CF,高位補0。無符號數右移1位相當於除以2。

2.40MOV   BL,20H        ;BL=20H

SHR   BL,1          ;BL=10H

3)算術左移指令

指令格式:SAL DST,COUNT  

操作說明SAL指令將目的操作數順序向左移1位或移CL寄存器中指定的位數。操作與SHL完全相同。

2.41SAL  WORD  PTR[BX+50],1       

4)算術右移指令

指令格式:SAR  DST,COUNT

    操作說明:SAR指令將目的操作數向右移1位或由CL寄存器指定的位數。右移一位時,操作數的最低位LSB移入進位標誌CF,最高位MSB保持不變。對帶符號數算術右移一位相當於將該數除以2。

2.42

SAR  AL,1

SAR  DI,CL

SAR  WORD  PTRTABLE[SI],1

SAR  BYTE  PTR[BX],CL

    4.循環移位指令

8086/8088指令系統有四條循環移位指令,包括不帶進位和帶進位循環移位。指令中指定的左移或右移的位數COUNT可以是1或由CL寄存器指定。所有循環移位指令都隻影響進位標誌CF和溢出標誌OF。

 (1)循環左移指令

  指令格式: ROL  DST,COUNT

  操作說明: ROL指令將目的操作數順序向左移1位或移CL寄存器中指定的位數。左移1位時,操作數的最高位MSB移入進位標誌CF的同時,還移到最低位LSB形成循環,進位標誌位不在循環環內。

    例2.43 ROL  AH,1      ;8位二進制數循環左移1位

ROL  DX,CL     ;16位二進制數循環左移CL位

操作說明:ROR指令將目的操作數順序向右移1位或右移CL寄存器中指定的位數。右移1位時,操作數的最低位LSB移入進位標誌CF的同時,還移到最高位MSB形成循環,進位標誌位不在循環環內。

 (2)循環右移指令

  指令格式: ROR  DST,COUNT

  操作說明:ROR指令將目的操作數順序向右移1位或移CL寄存器中指定的位數。右移1位時,操作數的最低位LSB移入進位標誌CF的同時,還移到最高位MSB形成循環,進位標誌位不在循環環內。

2.44ROR  CX,1

ROR  DX,CL

 (3)帶進位循環左移指令

指令格式:RCL    DST,COUNT

    操作說明:RCL指令將目的操作數連同進位標誌CF一起向左循環移動1位或CL寄存器中指定的位數。移動一位時,最高位MSB移入CF,而原CF移入最低位LSB。

【例2.45】ROR  CX,1

ROR  DX,CL

    (4)帶進位循環右移

指令格式: RCR  DST,COUNT

操作說明:RCR指令將目的操作數連同進位標誌CF一起向右循環移動1位或由CL寄存器中指定的位數。移動一位時,最低位LSB移入CF,而原CF則移入最高位MSB。

【例2.46】 測試AL寄存器中第5位的狀態,爲“0”時轉向ZERO,否則向下繼續執行。

方法1  用循環移位指令實現:

              MOV  CL,6

              ROR  AL,CL    ;將AL的bit5移入CF

              JNC  ZERO      ;若CF=0,則轉向ZERO處

                             ;否則,繼續執行

    ZERO:  ……

方法2:用測試指令實現:

TEST    AL,20H      ;將AL與20H相“與”

JZ    ZERO           ;若結果爲0,則轉向ZERO處

                   ;否則,繼續執行

ZERO:  ……

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章