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