我应该如何理解 %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 有疑问!
- 寄存器 %eax 是 %rax 的一部分吗?
- 汇编代码中第二行是什么意思? (movl $0, %eax)
- 我可以在汇编代码的第二行将 %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, %eax
或 xor %rax, %rax
来获得相同的效果。
我很难理解汇编代码。特别是我对使用寄存器感到困惑。 下面的代码是递归函数,它计算二进制数中“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 有疑问!
- 寄存器 %eax 是 %rax 的一部分吗?
- 汇编代码中第二行是什么意思? (movl $0, %eax)
- 我可以在汇编代码的第二行将 %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, %eax
或 xor %rax, %rax
来获得相同的效果。