Show HN:Decomp Academy – 学习将GameCube游戏反编译成匹配的C

2026-06-28 1 阅读 jackpriceburns
课程 阅读 asm · 编写 C · 编译器逐字节对其进行评分。跳回 → 0 / 264 匹配函数重建 0 正在进行 0 XP Recruit 已解决 已尝试 未开始 概念(阅读) 难度 1–5 I 热身 学习阅读机器 0 / 6 1 基础 在此继续 什么是反编译,PowerPC 寄存器,以及读取 MWCC 输出。 ~ 30 m 0 / 6 你的第一个匹配恢复参数也存在于寄存器中 添加两个寄存器 减法反转其操作数 立即数:常数数学 求反和零寄存器 II 核心习惯用法 每个形状 C 都编译为 0 / 164 2 整数算术 加法、减法、乘法、除法、立即数和位旋转习惯用法。 ~ 164 m 0 / 24 先加后减 两个加法,重新关联 先减后加 三指令链 乘以两个寄存器 乘以 2 的幂 乘以一个小常数 仿射表达式 无符号除以 2 的幂 有符号除以 2 的幂 实数除法 模数没有指令 乘法然后加 优先级更改两个乘积的顺序,减去 3 指令混合链 当乘法是移位时 混合链内的移位 除法然后添加 当除法是移位时 链中的移位除法 除法和乘法,然后减去乘法和除法 组合所有四个算术运算符 3 按位和移位 AND/OR/XOR、掩码、移位以及 rlwinm 系列 MWCC 喜爱。 ~ 122 m 0 / 16 使用 AND 屏蔽位 使用 OR 组合位 使用 XOR 翻转位 设置单个标志位 清除位:rlwinm 惊喜 测试是否设置位 通过常量逻辑右移(无符号)左移 算术右移(有符号) 移动可变量 在一个 rlwinm 中提取位字段 通过移位和或合并两个值来打包两个值字段:rlwinm + rlwimi 跨三个值链接异或 位选择 (Mux):AND、ANDC、OR Capstone:将三个值打包到一个字中 4 控制流 if/else、三元数、开关以及最重要的有符号与无符号比较。 ~ 151 m 0 / 19 返回比较作为布尔不等于是它自己的习惯用法 If / Else:比较手动提供分支补码、srawi 和 andc 概念钳位到零,无分支有符号比较:cmpw 无符号比较:cmplw 与常量比较:cmpwi 与 cmplwi 保护子句/提前返回 三元最大三元最小短路&& 和 ||开关:两个边界之间的比较链钳位 if / else-if 梯形 使用 && 拒绝超出范围的范围测试 ||多条件保护顶点:受保护、钳位的更新 5 个循环 for、while、do-while、归纳变量和计数循环。 ~ 125 m 0 / 15 计数循环的剖析 While 是相同的循环 Do-While:最紧的循环倒数更便宜 通过索引遍历数组查找最大值 遍历指向哨兵的指针 早期爆发 心理模型:循环概念的五个部分 强度缩减归纳 在嵌套循环中进行更多工作的循环 当内界跟随外界时,嵌套在二维数组上Capstone:计算网格扫描中的对 6 类型和宽度 u8/s8/u16/s16 负载、符号与零扩展以及宽度驱动的匹配,构建混合宽度和混合符号表达式。 ~ 141 m 0 / 17 加载字节 加载半字 有符号加载 符号扩展 存储字节截断 存储半字 u8,不是 char(虚假 extsb) 扩展:零与符号扩展截断 使用掩码进行符号扩展 在有符号宽度之间进行转换 比较操作码遵循类型碰撞 字节计数器 读取、缩放、截断有符号半字读-修改-写 在一个表达式中组合两种宽度混合符号 顶点:一个函数中的宽度和符号 7 指针和内存 加载和存储、寻址模式、指针算术和数组。 ~ 148 m 0 / 18 解引用指针 通过指针存储 常量索引变成位移 以常量索引指针写入 算术被缩放 变量索引需要缩放然后索引 字节数组不需要移位 半字数组移动一位 遍历字符串 比较两个指针 防止 NULL 通过指针交换 读取两个元素并组合它们 组合前缩放一个元素取消引用,然后用参数索引邻居从计算的偏移量中进行计算在同一索引处组合两个数组顶点:一个表达式中的多次取消引用8结构、联合和位字段从单个字段到跨嵌套结构、成员数组、联合和位字段组合多个字段。 ~ 168 m 0 / 22 读取结构体字段 写入结构体字段 窄字段:字节和半字加载 存储字节字段对齐 填充移动偏移量 组合两个字段 跨三个字段计算 嵌套结构体展平为一个偏移量 跨嵌套结构体组合字段 结构体数组:缩放索引 结构体内部数组 联合覆盖相同字节一位标志:li; rlwimi 多位位域写入 读取位域:rlwinm Extract Walking a