//绕过调用参数检查
元<型名 T>常式 整 打包大小()
{
中 的大小(T);
}
元<型名 T,型名 U,型名...O>
常式 整 打包大小(){
中 的大小(T)+打包大小<U,O...>();
}
元<型名 R,型名...A>
构 变调帮
{
静 常 整 k实参大小=打包大小<A...>();
静 空*函数;
静 常 空*k中帮助器指令;
静 空*本位地址;
静 空**跳目标;
静 R __c声明 跳器(A...a,...)无异;
元<型名...B>
静 R 调用(A...a,B...va)无异
{
R 结果;
动 实参大小=k实参大小/*可变*/+打包大小<B...>();
动 备份跳目标=*跳目标;
__汇编 移动 eax,本位;
__汇编 移动[本位地址],eax;
*跳目标=本位地址;
跳器(a...,va...);
本位:
__汇编 加 esp,[实参大小];
__汇编 移动[结果],eax;
*跳目标=备份跳目标;
中 结果;
}
恢复所有代码分析警告
};
元<型名 R,型名...A>
空*变调帮<R,A...>::函数=空针;
元<型名 R,型名...A>
空*变调帮<R,A...>::本位地址=空针;
元<型名 R,型名...A>
空**变调帮<R,A...>::跳目标=(空**)加游戏(专交反实现直3维编译);
元<型名 R,型名...A>
常 空*变调帮<R,A...>::k中帮助器指令=(常 空*)加游戏(专交反直3维编译);
//游戏假指令,`ESP+0h`必须为游戏码段指令
//|变参 N
//|变参 N-1
//|...
//|变参 1
元<型名 R,型名...A>
R _声明限定(坦白)__标调用 变调帮<R,A...>::跳器(A...,...)无异
{
__汇编
{
加 esp,4;
压 k中帮助器指令;
压 函数;//跳
中n;
}
}
//调用包装函数
元<型名 R,型名...A,型名...B>
R 变调包(空*H,A...a,B...va)
{
用 包装器型=变调帮<R,A...>;
包装器型::函数=H;
中 包装器型::调用(标::移动(a)...,va...);
}
还没有评论,来说两句吧...