gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:43:20 25 4
gpt4 key购买 nike

我试图在模板中传递一个函数指针,然后在 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* 似乎可以解决问题:

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

关于C++在函数模板中传递函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71867090/

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