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

标签 assembly

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

相关文章:

c++ - 函数返回机制 :Temporary object, R-Value, L-Value

c++ - C++ 的汇编程序输出中的重复析构函数

assembly - 如何在 MASM 中返回多个值

c++ - 导入二进制文件gnu-assembler时检查标签之间的距离

汇编:编译COM程序

c - 为什么这段代码可以从返回地址中得到函数地址呢?

assembly - 在 NASM 中使用 OR r/m32、imm32

assembly - ARM上CPSID指令与通用中断 Controller 的关系

assembly - 便宜的PowerPC评估板?

c - 如何从 C 代码中获取单操作数 imul