以x86汇编语言获取EAX寄存器的第一位

And*_*een 0 x86 assembly

在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
Run Code Online (Sandbox Code Playgroud)

Ira*_*ter 12

如果通过"第一位"表示最低有效位,则尝试:

 ...
 mov   ebx, eax
 and   ebx, 01
Run Code Online (Sandbox Code Playgroud)

你显然不明白指令一次对命名寄存器中的所有位进行操作,而"和"指令逐位组合它们的操作数.

下面的作品,也和可以说是你的要求更直接的解释("获得EAX的第一位,然后放入EBX"),但它破坏了EAX的内容:

 ...
 and   eax, 1
 mov   ebx, eax
Run Code Online (Sandbox Code Playgroud)

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

最后,你可以写:

 ...
 mov   ebx, 1
 and   ebx, eax
Run Code Online (Sandbox Code Playgroud)

这很好用,和其他两个一样快.我更喜欢第一个,因为它强调恕我直言,因为首先提到它,而不是"1",这只是一个偶然的常数,我关心的价值(EAX的内容).这种风格看起来似乎并不重要,但是如果你编写了很多代码,特别是汇编程序等神秘的东西,那么为了最大限度地提高后续可读性而做的事情是值得的.

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

  • 在'mov`没有零延迟的CPU上(IvB之前的Intel,Ryzen之前的AMD),`mov ebx,1` /`和ebx,eax`具有较低的延迟,因为`mov`不在关键路径上.这可能无关紧要,不值得额外的代码大小.(2个额外字节净增加). (2认同)

Mar*_*lor 5

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