目录

LASM 独立重实现

当前版本为 0.8.0,Windows x64 命令行 EXE。目标为完整迁移参考版本 3.2.4.6.windows,并实现 O1/O2 机器码逐字节一致。完整迁移仍在进行。

已通过 REA 提取原版 373 个助记符及 632 个指令模板。当前 EXE 使用其中已实现并对照验证的标量与向量范围。

已实现范围

  • 原生 C++17 程序,静态链接 C++ 运行库,运行时使用 Windows 系统库。
  • 一个输入文件、一个显式 .text 段、一个多行 @main 入口和多个输出文件。
  • 注释、整数常量声明 @b0 至 @b128、常量别名、128 位模运算字面量解析和数值宽度检查。
  • 标量与向量的 MOVIL、MOVIH、MOVILH 接受字面量截断后的无符号 64 位值。输出保留完整合法立即数的十六进制表示。
  • 300 种标量与向量运算,包含单周期整数运算、多周期乘法、点积、复数运算、浮点转换和浮点运算、逻辑、比较、移位、位操作、饱和、绝对值和前导零计数。各操作的立即数范围依照原版实测。
  • 八种 16 位短指令:SADD1、SADDU1、SSUB1、SSUBU1、SMOVI0L、SMOVI1L、SMOVI0H、SMOVI1H。无条件形式接受 0/1 立即数,包含死代码删除、寄存器分配、混合打包、分支重定位和 O1/O2 调度。
  • SMVCGC 的 39 个合法目标及 VMVCGC 的 7 个合法目标,包含 SCR、CVCCR、VLR 和 SVR0 至 SVR15。实现写回时点、执行完成时点及必要的 SNOP 插入。
  • SMVCCG 的 40 个合法读取目标及 VMVCCG 的 7 个合法读取目标,包含多周期结果写回与交错的读写依赖。
  • 24 种普通三源乘加与 4 种 IN 三源形式,包含受限寄存器编号、各功能单元及立即数形式。
  • 8 种向量归约形式,覆盖 2、4、8、16 路及 INC 变体,包含两个立即数字段及多周期流水调度。
  • 多逻辑变量的标量、向量独立寄存器分配,包含原版压力排序与并列选择。支持显式 R0 至 R63、VR0 至 VR63 以及带前导零的物理寄存器拼写。条件变量分配到对应寄存器组的 0 至 2 号。
  • O0 标签、条件指令、前向与后向标签分支、16 位寄存器间接分支、相对地址重定位和六周期分支延迟槽。
  • O1/O2 直线代码的多轮死代码删除、屏障、前向调度、功能单元选择、写回冲突处理和并行执行包。
  • .dat、.asm、.s、.dis,16/32 位指令混合打包、布局地址宽度及容量检查。
  • 布局 JSON 的架构、字节序、段别名、重叠范围和参数寄存器校验。
  • 中文路径、禁止覆盖源文件或布局、临时文件原子替换及并发完整输出。

EXE 没有加载、启动或嵌入原 lasm.exe,运行时无需 REA、Ghidra、Python 或 Node.js。开发对照脚本会显式调用用户提供的原版编译器。

运行

在项目目录打开 PowerShell。

.\bin\lasm-rebuild.exe --help
.\bin\lasm-rebuild.exe .\examples\immediate.la -O2 --layout .\config\m7004.json --output .\example.dat .\example.asm .\example.dis

输出父目录应已存在。编译器自身 --version 返回独立实现版本,兼容输出中的版本行保留参考版本标识。

.out/.o 返回 427,与该参考版本最小请求的实测拒绝行为一致。诊断文字尚未逐项复现。

构建

支持 Windows x64、MinGW GCC 15.1.0 + Ninja,或 Visual Studio 2022 C++ + Windows SDK,均使用 CMake。MSVC 构建静态链接 C++ 运行库。

powershell -NoProfile -ExecutionPolicy Bypass -File .\build.ps1

脚本优先选择 PATH 中的 MinGW,否则使用 Visual Studio 2022,构建目录分别为 build 和 build-msvc。可通过 -Toolchain MinGW 或 -Toolchain MSVC 显式选择。跨机器迁移时创建新的构建目录。固定依赖为 nlohmann/json 3.12.0,头文件及 MIT 许可证已随源码提供。

对照验证

以下测试需要 Python 和显式指定的原版编译器。目标目录必须尚不存在。

python .\tests\compare_control_subset.py --reference "C:\Users\ZZH\Desktop\autolasm\vendor\lasm0260908\bin\lasm.exe" --candidate .\bin\lasm-rebuild.exe --layout .\config\m7004.json --destination .\validation-control-new
python .\tests\compare_scalar.py --reference "C:\Users\ZZH\Desktop\autolasm\vendor\lasm0260908\bin\lasm.exe" --candidate .\bin\lasm-rebuild.exe --layout .\config\m7004.json --destination .\validation-scalar-new --random-count 200
python .\tests\compare_vector.py --reference "C:\Users\ZZH\Desktop\autolasm\vendor\lasm0260908\bin\lasm.exe" --candidate .\bin\lasm-rebuild.exe --layout .\config\m7004.json --destination .\validation-vector-new --random-count 600
python .\tests\compare_pipeline.py --reference "C:\Users\ZZH\Desktop\autolasm\vendor\lasm0260908\bin\lasm.exe" --candidate .\bin\lasm-rebuild.exe --layout .\config\m7004.json --destination .\validation-pipeline-new --random-count 600
python .\tests\compare_fma.py --reference "C:\Users\ZZH\Desktop\autolasm\vendor\lasm0260908\bin\lasm.exe" --candidate .\bin\lasm-rebuild.exe --layout .\config\m7004.json --destination .\validation-fma-new --random-count 600
python .\tests\compare_reductions.py --reference "C:\Users\ZZH\Desktop\autolasm\vendor\lasm0260908\bin\lasm.exe" --candidate .\bin\lasm-rebuild.exe --layout .\config\m7004.json --destination .\validation-reductions-new --random-count 600
python .\tests\validate_edges.py --candidate .\bin\lasm-rebuild.exe --destination .\validation-edges-new
python .\tests\compare_short.py --reference "C:\Users\ZZH\Desktop\autolasm\vendor\lasm0260908\bin\lasm.exe" --candidate .\bin\lasm-rebuild.exe --layout .\config\m7004.json --destination .\validation-short-new --random-count 100

历史 0.7.0 的 58,616 项输出原始字节比较全部一致,记录位于 validation/report.json、validation/scalar-report.json、validation/vector-report.json、validation/pipeline-report.json、validation/fma-report.json 和 validation/reduction-report.json。这些历史报告绑定旧版 EXE 的哈希,不能作为新版的全量重检结论。0.8.0 的本机验证结果与报告索引见 validation/summary.md。

Windows 的 ASM/S/DIS 源路径及 @bar 注释使用系统 ANSI 编码,与原版一致;源文件和命令行仍支持 Unicode 路径。

已复现的三源编码行为

普通三源格式及其立即数形式,在文本目标与第三源采用不同寄存器时,机器码保留第三源字段。IN 形式含有独立的目标字段。这些行为由原版编码函数和固定寄存器、虚拟变量对照共同确认,当前实现按逐字节兼容要求保留。

尚未实现

完整文法与表达式、浮点类型、导入、多输入、多段及数据布局、多函数及 ABI、地址寄存器、访存、跨寄存器组与其余向量指令、寄存器对、溢出到栈,以及优化级中的条件控制流和循环变换仍待迁移。

当前仅实现已列明的调度与资源模型,未完成完整 EIMS/PPBF 和所有失败回退路径。部分尚未覆盖的输入返回退出码 2。有限对照通过只证明相应用例一致,尚未进行 DSP 执行验证。

进展与逆向材料

迁移边界、版本历程和下一步工作见 PROGRESS.md。逆向资料和探针索引见 research/README.md。当前验证汇总见 validation/summary.md。

关于
9.8 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号