C++在函数模板中传递函数指针

C++ pass function pointer in function template

我正在尝试在模板中传递一个函数指针,然后在 asm 代码中使用它:

template <auto T>
_declspec(naked) void Test()
{
    __asm
    {
        lea eax, T
        jmp [eax]
    }
}

int main()
{
    Test<MessageBoxA>();
    Test<Sleep>();
}

我知道 naked 函数在执行时会崩溃,但我简化了代码以仅显示我想要实现的目标。

这段代码的问题是,一旦编译,如果你在反汇编器中查看汇编代码,它会是这样的:

lea eax, 0
jmp [eax]

它在eax中存储0。相反,它应该将 MessageBoxA 地址(和 Sleep 在另一个函数中)存储在 eax.

不知道是我哪里做错了还是编译器出错了。

我不是汇编专家,但创建一个 static constexpr void* 设置为 non-type 模板参数值似乎可以解决问题:

template <auto T>
__declspec(naked) void Test()
{
    static constexpr void* fptr = T;
    
    __asm 
    {
        lea eax, fptr
        jmp [eax]
    }
}

const void sleep()
{
}

int main()
{
    Test<(&sleep)>();
    return 0;
}

生成

lea     eax, OFFSET void * `void Test<&void sleep(void)>(void)'::`2'::fptr
jmp     SHORT DWORD PTR [eax]

示例可以在编译器资源管理器上运行:https://godbolt.org/z/f1d7daa49