可以根据参数列表和使用 C++17 折叠的一些逻辑填充虚拟机的适当寄存器,如下所示: https ://github.com/fwsGonzo/libriscv/blob/master/lib/libriscv/ machine_vmcall.hpp#L35
https://github.com/fwsGonzo/libriscv/blob/master/lib/libriscv/machine_vmcall.hpp#L18
结构将被压入堆栈,地址将占用一个整数寄存器槽。因此,我可以将常规函数调用转换为对我的虚拟机的调用。我认为任何其他编程语言都无法做到这一点。
现在,相反,有系统调用处理程序。它们看起来像这样: https ://github.com/fwsGonzo/libriscv/blob/master/emulator/src/syscalls.cpp#L20
为了简化系统调用处理,我希望能够获取参数类型列表,对它们中的每一个执行一些逻辑(根据类型提取值),然后可以选择使用我建立的参数调用 lambda。
参数的数量和类型是预先知道的。在从机器寄存器中提取这些值之前,这些值是未知的。
感谢@bipll 的回答。我选择这样实现它:
template<typename... Args, std::size_t... indices>
inline auto resolve_args(machine_t& m, std::index_sequence<indices...>)
{
std::tuple<std::decay_t<Args>...> retval;
((std::get<indices>(retval) = m.template sysarg<Args>(indices)), ...);
return retval;
}
template<typename... Args>
inline auto resolve_args(machine_t& m) {
return resolve_args<Args...>(m, std::index_sequence_for<Args...>{});
}