浮点指令、SSE 与可编辑参数
CE 自带 Tutorial 的第 4 关包含浮点数练习。本章介绍如何区分整数与浮点操作,检查可能出现的浮点指令,以及设计能够正确清理的可调参数。
先辨认数据和指令
找到可变化的练习数值后,先判断它可能是整数、Float 还是 Double;屏幕文字可以是格式化结果,不一定与存储值一一对应。浮点可能有舍入误差,扫描时应结合实际变化范围及选项,不以显示的小数精确推断所有内存字节。
写入指令附近可能出现 movss、addss、mulss 等单精度标量操作,或者以 sd 结尾的双精度操作。XMM 寄存器能保存浮点数据,但具体指令可能只处理低位,也可能有对其他位的规则;应根据该指令定义分析,不把 XMM 当成总是单一浮点数。观察读取、计算和写回三步,确认你希望改变的是输入、运算还是结果。
设置可调参数的思路
CE 的 AA 脚本可以分配一段内存用于存放参数,并注册名称供地址表访问;参数宽度须与使用它的指令一致。比如一个四字节单精度值不应被当作八字节 Double 读取。目标中的相对寻址、访问权限和分配距离都需由当前代码与实际编码决定。注册与分配只是保存参数,参数何时参与计算还需要经过正确验证的代码路径。
先在 Tutorial 第 4 关定位 Float 或 Double 值,按关卡操作改变它并核对地址表的显示。再观察写入或访问指令,以当前窗口实际显示为准;不保证各版本一定使用某条 SSE 指令。若另行构造可调参数,记录启用前值,启用后只改变一个参数,再观察结果。用两组不同输入检查公式,避免偶然相等造成误判。不要把反汇编中的十六进制位模式直接当成十进制浮点文字。
还原和排错
新代码若借用 XMM 寄存器,需保护后续仍需要的状态;若临时借用通用寄存器或修改条件标志,也须核对其生命周期。关闭时恢复原指令、注销参数符号,并安全释放分配区。程序重启后,旧地址不能沿用。
结果始终不变时,检查路径是否实际执行以及计算是否被后续指令覆盖;结果异常时检查类型、宽度、符号、参数和原指令重放。验收标准是目标行为可解释、不同输入下稳定,关闭后回到原有行为,且没有影响其他对象。