我试图在模板中传递一个函数指针,然后在 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/