我应该如何理解%eax寄存器在程序集代码中的用法



我很难理解汇编代码。特别是我对使用寄存器感到困惑。下面的代码是递归函数,它用二进制数计算"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 $0, %eax
testq %rdi, %rdi
je .L6
pushq %rbx
movq %rdi, %rbx
andl $1, %ebx
shrq %rdi # (by 1)
call pcount_r
addq %rbx, %rax
popq %rbx
.L6:
rep; ret

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

  1. 寄存器%eax是%rax的一部分吗
  2. 汇编代码中第二行的含义是什么?(月$0,%eax(
  3. 我可以在程序集代码的第二行将%eax更改为%rax吗

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

寄存器%eax是%rax的一部分吗?

是--它是64位%rax 的低32位

汇编代码中第二行的含义是什么?(月$0,%eax(

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

我可以在汇编代码的第二行将%eax更改为%rax吗?

是的,它可能会生成完全相同的指令。它可能会生成一条带有REX前缀的指令,它也会做同样的事情(因此是一条1字节以上的指令(。您也可以使用xor %eax, %eaxxor %rax, %rax来获得相同的效果。

最新更新