C++模板汇编技术

//绕过调用参数检查<型名 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...);
}

posted @ 2021-09-01 14:50  zjh6  阅读(18)  评论(0)    收藏  举报  来源