我应该如何理解 %eax 寄存器在汇编代码中的用法?

How should I understand usage of %eax register in assembly code?

我很难理解汇编代码。特别是我对使用寄存器感到困惑。 下面的代码是递归函数,它计算二进制数中“1”的个数 !!

/*recursive popcount*/
long pcount_r(unsigned long x) {
if (x == 0)
return 0;
else
return (x & 1)
+ pcount_r(x >> 1);
}

第一段代码是c写的,第二段是汇编代码

pcount_r:
movl [=11=], %eax
testq %rdi, %rdi
je .L6
pushq %rbx
movq %rdi, %rbx
andl , %ebx
shrq %rdi # (by 1)
call pcount_r
addq %rbx, %rax
popq %rbx
.L6:
rep; ret

汇编代码的第二行使用了寄存器eax。所以我对 eax 有疑问!

  1. 寄存器 %eax 是 %rax 的一部分吗?
  2. 汇编代码中第二行是什么意思? (movl $0, %eax)
  3. 我可以在汇编代码的第二行将 %eax 更改为 %rax 吗?

我试图找到答案,但大部分解释都很难理解。请帮助我!!

Is register %eax is part of %rax?

是的——它是 64 位 %rax

的低 32 位

What is the meaning of the second line in assembly code? (movl [=13=], %eax)

它将 0 加载到 %rax 的低 32 位,然后将高 32 位设置为 0(所有具有 32 位目标的指令都将 64 位寄存器的高 32 位设置为 0)

Can I change %eax to %rax at the second line of assembly code?

是的,它可能会生成完全相同的指令。它可能会生成一条带有 REX 前缀的指令,该指令执行相同的操作(因此是一条大 1 字节的指令)。您也可以使用 xor %eax, %eaxxor %rax, %rax 来获得相同的效果。