邏輯運算指令和移位指令

2021-04-09 10:07:11 字數 4725 閱讀 5862

and

xortest

shlsal

rolrcl

ornot

shrsar

rorrcr

and, or , xor 和 test都是雙位元組操作指令,運算元的定址方式的規定與算術運算指令相同.

not是單位元組操作指令,不允許使用立即數.

邏輯運算均是按位進行操作,真值表如下:

and(位與

&)or

( 位或

| )xor

( 位異或

^ )1 & 1 = 1

1 & 0 = 0

0 & 1 = 0

0 & 0 = 0

1 | 1 = 1

1 | 0 = 1

0 | 1 = 1

0 | 0 = 0

1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0

a:邏輯運算指令

and (and)

邏輯與指令

and    dst , src

//byte/word

執行操作

:dst = dst & src

1.and指令執行後,將使cf=0,of=0,af位無定義,指令執行結果影響sf,zf和pf標誌位.

2.and指令典型用法a:用於遮蔽某些位,即使某些位為0.

遮蔽al的高4位:

即將高4位和0000b相與,低4位和1111b相與

mov al , 39h     //

al=

0011

1001b

[39h]

add al , 0fh   

// al=

0000

1001b

[09h] 

即0011 1001b

[39h]

&  0000 1111b

[0fh]

= 0000 1001b

[09h]

3.and指令典型用法b:取出某一位的值(見

test)

or (or)

邏輯或指令

or    dst ,  src        

//byte/word

執行操作:

dst = dst | src

1.or指令執行後,將使cf=0, of=0, af位無定義,指令執行結果影響sf, zf和pf標誌位.

2.常用於將某些位置1.

將al的第5位置1:

mov al , 4ah    // al=010

01010b

[4ah]

or    al , 10h      // al=010

11010b

[5ah]  

即0100 1010b

[4ah]

|  0001 0000b

[10h]

=0101 1010b

[5ah]

xor (exclusive or)

邏輯異或指令

xor    dst , src       

//byte/word

執行操作:dst = dst ^ src

1.xor指令常用於使某個運算元清零,同時使cf=0,清除進製標誌.

2.xor指令使某些位維持不變則與 '0' 相異或,若要使某些位取反則與

'1'相異或.

將al的高4位維持不變,低4位取反:

mov al, b8h    //al=1011

1000

b[b8h]

xor  al, 0fh    //al=1011

0111

b[b7h]

即1011 1000b

[b8h]

^ 0000 1111

[0fh]

=1011 0111b

[b7h]

測試某乙個運算元是否與另一確定運算元相等:

xor    ax , 042eh

jz       ....   //如果ax==042eh, 則zf=true(1), 執行jz...

not (not)

邏輯非指令

not    opr                       

//byte/word

執行操作:opr = ~opr   // ~ 01100101

[65h]

=10011010

[9ah]

1.運算元不能使用立即數或段暫存器運算元,可使用通用暫存器和各種方式定址的儲存器運算元.

2.not指令不影響任何標誌位。

將al各位取反:

mov al,65h    //al=

0110 0101

b[65h]

not al             //al=

1001 1010

b[9ah]

即 ~ 0110 0101b

[65h]

=1001 1010b

[9ah]

test (test)

指令test    opr1 , opr2       

//byte/word

執行操作:opr1 & opr2

1.兩個運算元相與的結果不儲存,結果影響標誌位pf,sf和zf,使cf=0, of=0,而af位無定義.

2.test指令常用於在不改變原有的運算元的情況下,檢測某一位或某幾位的條件是否滿足.

只要令用來測試的運算元對應檢測位為1,其餘位為0,相與後判斷零標誌zf值的真假.

檢測某位是否為1:

令用來測試的運算元對應檢測位為1,其餘位為0,test指令後,若該位為1則 jnz...

test al , 0000 00001b   

//測試

al最低位是否為

1::

令用來測試的運算元對應檢測位為1,其餘位為0,執行test指令

jnz   ther

//最低位若為1,則

zf=false(0),

執行jnz ther,

否則執行下一條指令

.或者:先對運算元求反,令用來測試的運算元對應檢測位為1,其餘位為0,test指令後,若該位為1則jz...

mov    dl , al    //

將al

傳送到dl,

主要是不要影響

al的值

.  

以下測試al的

b2位是否為1

not    dl

//先對運算元求反

test    0000 0100b

//令用來測試的運算元對應檢測位為1,其餘位為0,執行test指令

jz    ther        //若al

的b2

位為1,

則zf=true(1),

執行jz    ther

b:移位指令

[所有的移位指令都影響標誌位cf、of、pf、sf和zf.af無定義.]

非迴圈邏輯移位

:把運算元看成無符數來進行移位.

shl ( shift logical left )邏輯左移指令

shl    opr , cnt

//byte/word

執行操作:使opr左移cnt位,並使最低cnt位為全0.

1.opr運算元不能使用立即數或段暫存器運算元,可使用通用暫存器和各種方式定址的儲存器運算元.

2.移位次數由cnt決定.每次將opr的最高位移出並移到cf,最低位補0.

mov  cl , 7            //

若移位多次

, 先預置移位次數

clshl    dx ,  cl       //cnt可取1

或cl

暫存器運算元

shr (shift logical right) 邏輯右移指令

shr    opr , cnt       

//byte/word

同shl,每次將opr的最低位d0移出並移到cf.最高位補0.

非迴圈算術移位

:將運算元看成有符號數來進行移位.

sal (shift arithmetic left) 算術左移指令

sal    opr , cnt

//byte/word

sal指令與shl指令完全相同

sar(shift arithmetic right) 算術右移指令

sar    opr , cnt   

//byte/word

sar指令每次移位時,將最高位移入次高位的同時最高位值不變,最低位d0移出並移到cf.

迴圈移位指令

rol ( rotate left) 迴圈左移指令

rol    opr , cnt   

//byte/word

每次移位時,最高位移出並同時移到cf和最低位d0.

ror (rotate right)迴圈右移指令ror

opr,cnt   

//byte/word

每次移位時,最低位d0移出並同時移到cf和最高位.

帶進製迴圈移位指令

rcl (rotate left through carry)帶進製迴圈左移指令

rcl    opr,cnt

//byte/word

rcr (rotate right through carry)帶進製迴圈左移指令

rcr    opr ,cnt

//byte/word

8086 8088移位指令

目錄 非迴圈移位 1.1 邏輯左移 shl 1.2 邏輯右移 shr 1.3 算術左移 sal 1.4 算術右移 sar 迴圈移位 2.1 迴圈左移 rol 2.2 迴圈右移 ror 2.3 帶進製迴圈左移 rcl 1.4 帶進製迴圈右移 rcr總結 1.非迴圈移位 1.1 邏輯左移 shl 運算元...

80X86學習筆記 邏輯運算與移位指令

格式 not oprd 該指令把運算元oprd取反,然後送回oprd,oprd可以是通用暫存器,也可是儲存器運算元,對標誌沒有影響。格式 and orpd1,oprd2 對兩個運算元進行按位邏輯與運算,結果送到oprd1。該指令執行後,cf 0,of 0,pf,zf,sf反應運算結果,af未定義。某...

80X86學習筆記 邏輯運算與移位指令

格式 not oprd 該指令把運算元oprd取反,然後送回oprd,oprd可以是通用暫存器,也可是儲存器運算元,對標誌沒有影響。格式 and orpd1,oprd2 對兩個運算元進行按位邏輯與運算,結果送到oprd1。該指令執行後,cf 0,of 0,pf,zf,sf反應運算結果,af未定義。某...