AND 指令在兩個(gè)操作數(shù)的對(duì)應(yīng)位之間進(jìn)行(按位)邏輯與(AND)操作,并將結(jié)果存放在目標(biāo)操作數(shù)中:
AND destination,source
下列是被允許的操作數(shù)組合,但是立即操作數(shù)不能超過(guò) 32 位:
AND reg, reg
AND reg, mem
AND reg, imm
AND mem, reg
AND mem, imm
操作數(shù)可以是 8 位、16 位、32 位和 64 位,但是兩個(gè)操作數(shù)必須是同樣大小。兩個(gè)操作數(shù)的每一對(duì)對(duì)應(yīng)位都遵循如下操作原則:如果兩個(gè)位都是 1,則結(jié)果位等于 1;否則結(jié)果位等于 0。
下表展示了兩個(gè)輸入位 X 和 Y,第三列是表達(dá)式 X^Y 的值:
X | Y | X^Y |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
AND 指令可以清除一個(gè)操作數(shù)中的 1 個(gè)位或多個(gè)位,同時(shí)又不影響其他位。這個(gè)技術(shù)就稱為位屏蔽,就像在粉刷房子時(shí),用遮蓋膠帶把不用粉刷的地方(如窗戶)蓋起來(lái)。
例如,假設(shè)要將一個(gè)控制字節(jié)從 AL 寄存器復(fù)制到硬件設(shè)備。并且當(dāng)控制字節(jié)的位 0 和位 3 等于 0 時(shí),該設(shè)備復(fù)位。那么,如果想要在不修改 AL 其他位的條件下,復(fù)位設(shè)備,可以用下面的指令:
and AL, 11110110b ;清除位 0 和位 3 ,其他位不變
如,設(shè) AL 初始化為二進(jìn)制數(shù) 1010 1110,將其與 1111 0110 進(jìn)行 AND 操作后,AL 等于 1010 0110:
mov al,10101110b
and al, 11110110b ;AL 中的結(jié)果 = 1010 0110
標(biāo)志位
AND 指令總是清除溢出和進(jìn)位標(biāo)志位,并根據(jù)目標(biāo)操作數(shù)的值來(lái)修改符號(hào)標(biāo)志位、零標(biāo)志位和奇偶標(biāo)志位。比如,下面指令的結(jié)果存放在 EAX 寄存器,假設(shè)其值為 0。在這種情況下,零標(biāo)志位就會(huì)置 1:
and eax,1Fh
將字符轉(zhuǎn)換為大寫(xiě)
AND 指令提供了一種簡(jiǎn)單的方法將字符從小寫(xiě)轉(zhuǎn)換為大寫(xiě)。如果對(duì)比大寫(xiě) A 和小寫(xiě) a 的 ASCII 碼,就會(huì)發(fā)現(xiàn)只有位 5 不同:
0 1 1 0 0 0 0 1 = 61h ('a')
0 1 0 0 0 0 0 1 = 41h ('A')
其他的字母字符也是同樣的關(guān)系。把任何一個(gè)字符與二進(jìn)制數(shù) 1101 1111 進(jìn)行 AND,則除位 5 外的所有位都保持不變,而位 5 清 0。下例中,數(shù)組中所有字符都轉(zhuǎn)換為大寫(xiě):
.data array BYTE 50 DUP(?) .code mov ecx,LENGTHOF array mov esi,OFFSET
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持html5模板網(wǎng)。