2010-07-16 46 views
5

如何寫入使用程序集清除AL寄存器中位0和1的指令?清除程序集寄存器中的位

+0

在什麼彙編?在什麼CPU上? – 2010-07-16 05:26:06

+3

自從談到AL以來,CPU顯然是x86。 – mathk 2010-07-16 05:27:12

+0

需要'功課'標籤? – 2010-07-16 10:01:38

回答

-2
and al, 0xFD 

,使其適應您使用的是彙編:氣體,NASM,MASM ...

編輯:其實這是and al, 0xFC但你的想法

+3

和al,0xFC 您的回答只清除了位1,而不是位0. – Demi 2010-07-16 05:30:20

+0

無論如何,重點是AND。 – mathk 2010-07-16 10:54:32

6

和Al 11111100b假設MASM格式

3

AL是AX寄存器的低字節,所以你應該能夠通過AND AL 0xFC屏蔽掉低位。

AND AL,0xfc 
-2

把它等於零?

MOV人,00000000

AX = 16位 人= 8位

現在如果有什麼與人相或答案是一樣的什麼邏輯或

如果有任何事情與al結合答案將是「0」

所以我想清除它與所有1或全0取決於你的工作,以及你如何確定沒有什麼在註冊表中。

+0

如何評論爲什麼這是不明確的負面標記/?怎麼了?我也在學習 – user287745 2010-07-16 10:08:13

+1

它看起來似乎並沒有真正理解這個問題和/或不知道如何回答它,這可能就是爲什麼你有一些downvotes。看看其他(正確的)答案,以更好地理解要問什麼以及如何解決問題。一般來說,如果(a)你有理由相信你理解了這個問題,並且(b)你有一些信心,你可以提供一個有用的答案,那麼嘗試回答問題可能是一個好主意。祝你好運。 – 2010-07-16 11:25:18

+0

他只想清除最低2位,而不是整個寄存器(或子寄存器),您的方法會丟棄太多的位,因此它完全是錯誤的方法,只能看到上面的方法。 哈哈,忍耐14秒忍者保羅R是:P – Necrolis 2010-07-16 11:25:33

2

您可以使用AND操作清除位。

for each bit index `i` 
    result[i] = boolean_and(first[i], second[i]) 

.--------- commonly associated symbol for the operation 
| 

& 1 0 <- first argument 
------- 
1 | 1 0 <- result 
0 | 0 0 

^--------- second argument 

用一個字節一個例子:

00101100 
00111010 
     & 
00101000 

所以,你可以使用此操作在寄存器來掩蓋和翻轉位的區域。作爲第二個參數傳遞一個常數,它有點翻轉起來,你想跟上。

x86 mnemonic: AND a, b 
operation: a = a & b 

這裏是如何做到這一點,除非你還不瞭解它:

AND eax, 0xfffffffc 

AL是EAX的最低字節部分-register所以你可以這樣來做。

這裏的二進制 - >十六進制轉換表:

0000 | 0 
0001 | 1 
0010 | 2 
0011 | 3 
0100 | 4 
0101 | 5 
0110 | 6 
0111 | 7 
1000 | 8 
1001 | 9 
1010 | a 
1011 | b 
1100 | c 
1101 | d 
1110 | e 
1111 | f 

哦,你應該從你的後腦勺,如果你要成爲一個有自尊心的彙編程序員知道記住這一點。

還讀了關於OR和XOR位操作。

1

還有另外一種方法,通過使用xor
例子來做到這一點:

mov al, ff 

xor al, 00000011b  

al = fc because we cleared bit 0 and 1 
+1

只有當位0和位1在xor之前打開時,xor'纔有效,但問題沒有這樣的先決條件,並且不管這些位是否清零。 – 2013-05-23 05:12:02