gpt4 book ai didi

c++ - 调用具有不同 arg 计数的函数

转载 作者:行者123 更新时间:2023-11-30 04:59:56 24 4
gpt4 key购买 nike

我正在反编译一个非常古老的游戏,我的目标是恢复 100% native 代码。因此,我需要尽可能多地保留现有架构(例如,仅使用 std::function 并不是很有帮助)。

我有一组具有不同数量参数的static 函数。它们存储在这样的结构中:

struct ScriptFunction 
{
const wchar_t* m_name;
void* m_func; // ptr to specific function
void* m_returnType;
int m_argCount;
};

并且像这样填充:

ScriptFunction s_functions[206] = {
{L"AddMoveAroundDesire", &ScriptFunctions::AddMoveAroundDesire, &CScriptType::s_void, 2},
{L"AddDoNothingDesire", &ScriptFunctions::AddDoNothingDesire, &CScriptType::s_void, 2},
{L"AddAttackDesire", &ScriptFunctions::AddAttackDesire, &CScriptType::s_void, 3},
{L"AddAttackDesireEx", &ScriptFunctions::AddAttackDesireEx, &CScriptType::s_void, 4},
{L"AddGetItemDesire", &ScriptFunctions::AddGetItemDesire, &CScriptType::s_void, 2},
...

那么,如何使用给定的 m_argCountvoid** 参数调用 ScriptFunction::m_func?我必须以某种方式将参数压入堆栈并调用函数调用,但我不知道。

一些汇编代码? va_list?但是如何在运行时填充它呢?

更新:调用者看起来像这样

void CScriptAccessible::InvokeInternal(ScriptFunction* scriptFunc, void** args)
{
// here I have to push params from **args** to stack
// and somehow call ScriptFunction::m_func
// In assembly I could see pushes to stack in a loop (driven by
// ScriptFunction::m_argCount). But I'm wondering, whether it's
// possible to do in C++ (push args on stack and call function by just address)
}

最佳答案

在该语言中,只有 switch/cast 解决方案。这让编译器生成正确的调用约定:例如,在 x86-64 Linux 上,前几个参数在预定义的寄存器中传递。 (优化器可能会将不同的路径合并为跳转到您所期望的那种展开的循环中。)还请记住,仅在 C/C++ 中,根本没有“堆栈”。

顺便说一句,也不能保证对函数使用 void*(因为它可以指向任何对象,但它们不是对象),尽管它通常有效(和 POSIX dlsym 需要它)。

关于c++ - 调用具有不同 arg 计数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51009653/

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