1

在 x86 汇编语言中,是否可以获得寄存器的第一位?我想获取eax寄存器的第一位并将其移入ebx,但我还不确定如何执行此操作。

.stack 2048

.data

ExitProcess proto, exitcode:dword 

.code
start:
mov eax, 3;
;now I want to move the first bit of eax into ebx. How can I obtain the first bit from eax?
invoke  ExitProcess, 0
end start
4

5 回答 5

13

如果“第一位”是指最低有效位,请尝试:

 ...
 mov   ebx, eax
 and   ebx, 01

您显然不明白指令一次对命名寄存器中的所有位进行操作,并且“and”指令将它们的操作数逐位组合。

以下内容也有效,可以说是对您的请求的更直接解释(“获取 eax 的第一位,然后放入 EBX”),但它破坏了 EAX 的内容:

 ...
 and   eax, 1
 mov   ebx, eax

在汇编代码中,由于寄存器很少,它们的内容往往很宝贵,因此通常避免在计算新结果时破坏一个寄存器的内容。(当你不能时,你不能,但这种情况很容易避免)。

最后,你可以写:

 ...
 mov   ebx, 1
 and   ebx, eax

这工作正常,并且与其他两个一样快。我更喜欢第一个,因为它强调了恕我直言我关心的价值(EAX 的内容),因为它首先提到它,而不是“1”,这只是一个偶然的常数。这种风格可能看起来并不重要,但如果你写了很多代码,尤其是像汇编这样的晦涩难懂的东西,这样做以最大限度地提高以后的可读性是很值得的。

查找英特尔参考手册是值得的,并仔细阅读它们以了解每条机器指令的作用。这似乎是一项艰巨的任务,因为它是一本大书;只需专注于您最初似乎需要的说明。

于 2013-03-06T05:26:29.437 回答
5

从寄存器中获取一个位涉及到and一个掩码操作,该掩码在感兴趣的位位置为 1,在所有其他位中为 0。然后可选地,arotate right或 arotate left将位移动到结果中的所需位置。

于 2013-03-06T03:44:46.940 回答
0

也可以使用汇编的轮换属性,即使用bit指令将指定位复制到进位标志中,我们可以使用轮换进位标志指令。

我认为这对于了解在何处以及如何使用和放置爆破钻头方面发生了什么非常有效。

于 2018-04-28T19:15:46.973 回答
0

如上所述,在这里使用movand是最快的解决方案,但编程的有趣之处在于可以为单个问题找到许多解决方案,因此作为一种效率较低的替代方案,您可以使用以下代码之一。

所以你也可以这样解决:

xor ebx, ebx ; sets ebx = 0
TEST eax, 1 ; is the lowest bit set?
JZ skip_add ; if low bit is zero, skip next instruction

; if lowest bit was set / AND op resulted not zero
add ebx, 1 ; ebx += 1, or use `INC ebx`

skip_add:
; process the result

或者,您也可以使用:

xor ebx, ebx ; ebx = 0
shr eax, 1 ; shift right: lowest bit in carry flag now
adc ebx, 0 ; ebx += 0 + carry bit
shl eax, 1 ; get back original value of eax, `shl` and `or` with ebx
or eax, ebx ; or use `push eax` and `pop eax` instead

另一种选择(类似于其他答案,但成本更高):

push eax
and eax, 1
xchg ebx, eax ; swap contents, could also use `mov` here
pop eax

请注意,这两种解决方案都不会更改 中的值eax,因此您仍然可以自由使用 eax 中的值。另请注意,注释值用于eax具有mov eax, 3问题中使用的 3 值。

如果您已经知道,即ebx为零,则可以跳过这些xor行,如果更改eax无关紧要,您也可以删除该shl操作。所以实际操作是通过大约两条指令完成的,如您所见。不过,关于 µops,请参阅 Peter 的评论。

于 2018-09-04T11:32:24.183 回答
-2

...第一点:

test eax, 1
setz ebx

短剑

于 2013-03-28T07:10:08.177 回答