小编Gil*_*llé的帖子

使用 LEA 相对于 MOV 在从 C++ 编译的程序集中传递参数的优势

我正在尝试编译 C++ 代码时将参数传递给函数的方式。我尝试使用x64 msvc 19.35/latest编译器编译以下 C++ 代码以查看生成的程序集:

#include <cstdint>

void f(std::uint32_t, std::uint32_t, std::uint32_t, std::uint32_t);

void test()
{
    f(1, 2, 3, 4);
}
Run Code Online (Sandbox Code Playgroud)

并得到这个结果:

void test(void) PROC
        mov     edx, 2
        lea     r9d, QWORD PTR [rdx+2]
        lea     r8d, QWORD PTR [rdx+1]
        lea     ecx, QWORD PTR [rdx-1]
        jmp     void f(unsigned int,unsigned int,unsigned int,unsigned int)
void test(void) ENDP
Run Code Online (Sandbox Code Playgroud)

godbolt.org 上的结果

我不明白的是,为什么编译器在这个例子中选择使用lea而不是简单的。mov我了解它的机制lea以及它如何在每个寄存器中产生正确的值,但我希望有更简单的东西,例如:

void test(void) PROC
        mov     ecx, 1
        mov     edx, 2
        mov     r8d, 3
        mov     r9d, 4 …
Run Code Online (Sandbox Code Playgroud)

c++ assembly x86-64 micro-optimization visual-c++

4
推荐指数
2
解决办法
182
查看次数

标签 统计

assembly ×1

c++ ×1

micro-optimization ×1

visual-c++ ×1

x86-64 ×1