我正在尝试做
and eax, 0fh
我知道0fh
意味着什么15
。从
and eax, 0fh
我应该清除除最后 4 位之外的所有eax
. 我不明白你是如何得到 (32-4)=28 位 1 和 4 0 的。
我正在尝试做
and eax, 0fh
我知道0fh
意味着什么15
。从
and eax, 0fh
我应该清除除最后 4 位之外的所有eax
. 我不明白你是如何得到 (32-4)=28 位 1 和 4 0 的。
二进制中的 15 是1111
(实际上 15=8+4+2+1);添加填充零以达到 32 位(的宽度eax
)我们得到
00000000000000000000000000001111
现在,如果你and
用 eax 的内容做一个二进制,显然你清除了eax
除最后 4 位之外的所有位,因为零“杀死”了相应位置的任何数字,而那些让它“存活”。
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx AND
00000000000000000000000000001111
----------------------------------------
0000000000000000000000000000xxxx
为简洁起见,让我们看看这个指令:
and al, 0fh
0fh
转换为00001111
二进制。
现在不管x
每一位是什么,这就是我们在二进制中得到的:
al xxxxxxxx
0fh 00001111
------------
and 0000xxxx
具体例子:
al 01010101
0fh 00001111
------------
and 00000101
您不会得到 28 个 1 位,然后是 4 个 0 位,相反。0fh
是:
000...0001111
当你and
有一个 1 位的东西时,你会得到那个东西。当您and
使用 0 位时,您总是得到零(有关按位运算符的论文,请参见此处)。
AND
因此,使用 with000..001111
将清除除最右边 4 位之外的所有位。