gpt4 book ai didi

assembly - 为什么 gcc movl 到同一个寄存器?

转载 作者:行者123 更新时间:2023-12-02 07:59:43 24 4
gpt4 key购买 nike

对于这段 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com