对于这段 C 代码:
uint64_t roundUp(uint64_t value, uint32_t blockSize)
{
return (value + blockSize - 1) & ~(blockSize - 1);
}
gcc 4.6 -O3 生成了以下程序集:
roundUp(unsigned long, unsigned int):
.LFB0:
.cfi_startproc
movl %esi, %edx
movl %esi, %esi
leaq -1(%rdi,%rsi), %rax
negl %edx
andl %edx, %eax
ret
.cfi_endproc
谁能告诉我为什么要这样做?
movl %esi, %esi
最佳答案
这会清除高 32 位。当您写入 x86-64 中的 32 位寄存器时,高 32 位会自动清除。由于esi
包含32位参数,因此高32位可以包含任何值,因此需要在使用rsi
之前清除它们。
关于assembly - 为什么 gcc movl 到同一个寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10748205/