在汇编中清除寄存器中的位

6
如何使用汇编语言编写一条指令,清除AL寄存器中的0和1位?

用什么汇编语言?在哪个CPU上? - Yann Ramin
5
CPU 显然是 x86,因为它涉及到 AL。 - mathk
6个回答

7

假设采用MASM格式,则将AL和11111100b进行逻辑与操作。


6
您可以使用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寄存器的最低字节,所以您可以这样做。

下面是二进制转十六进制的转换表:

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位运算的相关内容。


4

AL是AX寄存器的低字节,因此您应该能够使用AND AL 0xFC来屏蔽低位。

AND AL,0xfc

-2

还有另一种方法可以使用 xor
例子:

mov al, ff

xor al, 00000011b    

al = fc because we cleared bit 0 and 1

1
“xor” 只有在执行异或操作之前,位 0 和位 1 都为开启状态时才有效,但是问题并没有提出这样的先决条件,而是希望无论如何都清除这些位。 - Tony Delroy

-3
and al, 0xFD

根据你使用的汇编器进行适应:gas、nasm、masm等。

编辑:实际上是and al, 0xFC,但你明白我的意思。


-4

将其归零?

例如:

mov al,00000000

ax=16位 al=8位

现在,如果任何东西与al进行或运算,答案将与所进行的或运算相同

但是

如果任何东西与al进行与运算,答案将为“0”

因此,我想用全1或全0清除它取决于您的工作以及您希望如何识别寄存器中没有任何内容。


为什么对于否定标记这么不清楚,能否加上一些注释说明一下?有什么问题吗?我也在学习。 - user287745
1
看起来你并没有真正理解问题,或者不知道如何回答它,这可能是你得到一些负评的原因。查看其他(正确的)答案以更好地理解正在被问什么以及如何解决它。通常,如果(a)你相当确定自己理解问题,(b)你有信心能够提供有用的答案,那么尝试回答问题可能是一个好主意。祝你好运。 - Paul R
他只想要清除最低的2位,而不是整个寄存器(或子寄存器),你的方法丢弃了太多位,因此完全错误,只需查看在你上面的方法。哈哈,14秒忍者保罗 R 是 :P - Necrolis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接