1

我正在尝试做

and eax, 0fh

我知道0fh意味着什么15。从

and eax, 0fh

我应该清除除最后 4 位之外的所有eax. 我不明白你是如何得到 (32-4)=28 位 1 和 4 0 的。

4

3 回答 3

4

二进制中的 15 是1111(实际上 15=8+4+2+1);添加填充零以达到 32 位(的宽度eax)我们得到

00000000000000000000000000001111

现在,如果你and用 eax 的内容做一个二进制,显然你清除了eax除最后 4 位之外的所有位,因为零“杀死”了相应位置的任何数字,而那些让它“存活”。

  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx AND
  00000000000000000000000000001111
----------------------------------------
  0000000000000000000000000000xxxx
于 2013-07-09T01:25:22.157 回答
1

为简洁起见,让我们看看这个指令:

and al, 0fh

0fh转换为00001111二进制。

现在不管x每一位是什么,这就是我们在二进制中得到的:

al  xxxxxxxx
0fh 00001111
------------
and 0000xxxx

具体例子:

al  01010101
0fh 00001111
------------
and 00000101
于 2013-07-09T01:27:48.737 回答
1

不会得到 28 个 1 位,然后是 4 个 0 位,相反。0fh是:

000...0001111

当你and有一个 1 位的东西时,你会得到那个东西。当您and使用 0 位时,您总是得到零(有关按位运算符的论文,请参见此处)。

AND因此,使用 with000..001111将清除除最右边 4 位之外的所有位。

于 2013-07-09T01:26:16.110 回答