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 @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示