Assembly 布爾型按位運(yùn)算

2018-10-27 14:09 更新

有四個(gè)普遍的布爾型運(yùn)算符,它們是:AND,OR,XOR和NOT。真值表展示了每一個(gè)可能的操作數(shù)得到的運(yùn)算結(jié)果。


AND運(yùn)算符

兩個(gè)比特位的AND運(yùn)算結(jié)果只有當(dāng)這兩位都是1時(shí)才為1,否則結(jié)果就為0,就像真值表3.1展示的一樣。

一個(gè)字節(jié)的AND運(yùn)算

處理器支持這些運(yùn)算指令對(duì)數(shù)據(jù)的所有位平等地進(jìn)行獨(dú)立的運(yùn)算。例如:如果對(duì)AL和BL里的內(nèi)容進(jìn)行AND運(yùn)算,那么基本的AND運(yùn)算將應(yīng)用于在這兩個(gè)寄存器里的8對(duì)比特位中的每一對(duì),像圖3.2 展示的一樣。下面是一個(gè)代碼例子:

1         mov        ax, 0C123H
2         and         ax, 82F6H           ; ax = 8022H

OR運(yùn)算符

兩個(gè)比特位的包含OR運(yùn)算結(jié)果只有當(dāng)這兩位都是0時(shí)才為0,否則結(jié)果就為1,就像真值表3.2展示的一樣。下面是一個(gè)代碼例子:

1         mov        ax, 0C123H
2         xor         ax, 0E831H           ; ax = E933H

XOR運(yùn)算

兩個(gè)比特位的互斥XOR運(yùn)算結(jié)果只有當(dāng)這兩位相等時(shí)為0,否則結(jié)果就為1,就像真值表3.3展示的一樣。下面是一個(gè)代碼例子:

1         mov        ax, 0C123H
2         xor         ax, 0E831H ; ax = 2912H

OR/XOR運(yùn)算

NOT運(yùn)算

NOT運(yùn)算符是一元運(yùn)算符(也就是說(shuō),它只對(duì)一個(gè)操作數(shù)進(jìn)行運(yùn)算,而不像二元運(yùn)算符,如:AND)。一個(gè)比特位的NOT運(yùn)算結(jié)果是這個(gè)位值的相反數(shù),像真值表3.4展示的一樣。下面是一個(gè)代碼例子:

NOT運(yùn)算

1         mov        ax, 0C123H
2         not         ax                       ; ax = 3EDCH


注意,NOT能得到一個(gè)數(shù)的補(bǔ)碼。與其它按位運(yùn)算不同的是,NOT指令并不修改在FLAGS寄存器里的任何一位。

TEST指令

TEST指令執(zhí)行一次AND運(yùn)算,但是并不儲(chǔ)存結(jié)果。它會(huì)基于可能的結(jié)果對(duì)FLAGS寄存器進(jìn)行設(shè)置(非常像CMP指令執(zhí)行了一次減法操作但是只是設(shè)置了FLAGS)。例如:如果結(jié)果是0,那么ZF就被置位了。

位操作的應(yīng)用

位操作對(duì)于操縱數(shù)據(jù)單個(gè)位而不修改其它位來(lái)說(shuō)是非常有用的。表3.5展示了這些操作的三個(gè)普遍的應(yīng)用。下面是一些實(shí)現(xiàn)了這些想法的代碼例子。

實(shí)例1

布爾運(yùn)算


實(shí)例2

AND運(yùn)算還可以用來(lái)得到除以2的幾次方之后的余數(shù)。要得到除以數(shù)2i之后的余數(shù),只需對(duì)這個(gè)數(shù)和等于2i -1的掩碼進(jìn)行AND運(yùn)算。這個(gè)掩碼從位0到位2i - 1都為1,也就是這些位包含了余數(shù)。AND運(yùn)算的結(jié)果將保留這些位,而將其它位輸出為0。下面是一個(gè)得到100除以16的商和余數(shù)的代碼小片斷。

實(shí)例3

使用CL寄存器,就使得修改數(shù)據(jù)中的任何一位變得有可能。下面是一個(gè)對(duì)EAX任意比特位置位(開(kāi)啟)的例子。需要置位的比特位儲(chǔ)存在BH中。

實(shí)例4

求反任意一個(gè)比特位的代碼留給了讀者,做為一個(gè)習(xí)題。在一個(gè)80x86程序中看到這個(gè)莫名其妙的指令是很平常的:

xor         eax, eax             ; eax = 0

一個(gè)數(shù)字與自己進(jìn)行XOR運(yùn)算,其結(jié)果總是0。這條指令被使用是因?yàn)樗a(chǎn)生的機(jī)器代碼比功能相同的MOV指令要少。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)