docs.rs failed to build alaz-0.1.1
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Visit the last successful build:
alaz-0.1.0
ALAZ - Assembly Language Analyzer
ALAZ (Assembly Language Analyzer) 是一个强大的 AArch64 汇编语言分析工具,用于解析 objdump 输出文件并生成美观的 Markdown 分析报告。
✨ 功能特性
- 🔍 智能解析: 自动解析 objdump 输出,提取汇编指令和源代码对应关系
- 📊 多级对比: 支持 O0/O1/O2 三个优化级别的汇编代码对比分析
- 🎯 语义解释: 基于 JSON 数据库的指令语义解释系统,支持 237 条 AArch64 指令
- 🎨 美观输出: 生成格式化的 Markdown 表格,便于阅读和分享
- 🖥️ 交互模式: 提供友好的交互式菜单,快速浏览和选择函数
- 📝 单文件分析: 支持对单个 dump 文件进行详细分析
- ⚡ 高性能: Rust 编写,解析速度快,资源占用低
- 🔧 可扩展: 基于 JSON 的指令定义,易于添加新指令
🎯 支持的指令集
ALAZ v0.1.1 支持 237 条 AArch64 指令,涵盖:
核心指令集
- ✅ 数据处理: 算术、逻辑、移位、位操作(60+条)
- ✅ 加载/存储: 各种寻址模式、成对操作(30+条)
- ✅ 分支控制: 条件/无条件跳转、函数调用(20+条)
- ✅ 条件操作:
csel,csinc,cset等(11条)- 新增
高级特性
- ✅ 浮点运算: 基本运算、融合乘加
fmla/fmls、转换、取整(35+条) - ✅ SIMD/NEON: 向量运算、累加、饱和运算、位计数(40+条)
- ✅ 原子操作:
ldadd,cas,swp及字节/半字变体(24+条) - ✅ 加密扩展: AES (
aese/aesd), SHA-1, SHA-256(10+条) - ✅ CRC 校验:
crc32b/h/w/x系列(5条) - ✅ 指针认证: PAC/AUT 指令(4条)
- ✅ 内存标签: MTE 指令(4条)
- ✅ PC相对寻址:
adr/adrp- 新增 - ✅ 位域操作:
ubfiz,sbfiz,extr- 新增 - ✅ 系统控制: 内存屏障、异常处理(10+条)
📦 安装
从源码编译
# 克隆仓库
# 编译并安装
# 或者只编译
# 可执行文件位于 target/release/alaz
使用 Cargo 安装
🚀 快速开始
1. 准备 dump 文件
首先,使用 objdump 生成反汇编文件:
# 编译不同优化级别的代码
# 生成 dump 文件
2. 交互式分析
# 多文件模式 - 分析三个优化级别的共同函数
# 单文件模式 - 只分析一个 dump 文件
3. 直接分析指定函数
# 分析 Matrix_add 函数,生成对比报告
# 指定输出目录
📖 使用指南
命令概览
交互式模式
多文件模式(默认)
分析三个优化级别的共同函数,生成对比报告:
# 使用文件前缀
# 或显式指定多文件模式
# 指定输出目录
特点:
- ✅ 自动读取
matrix_O0.dump,matrix_O1.dump,matrix_O2.dump - ✅ 只显示在三个文件中都存在的函数
- ✅ 生成
<函数名>_comparison.md对比报告 - ✅ 包含三个优化级别的完整对比
单文件模式
只分析一个 dump 文件:
# 分析 O2 优化级别的文件
# 分析 O0 优化级别的文件
特点:
- ✅ 显示该文件中的所有函数
- ✅ 可以选择函数进行详细分析
- ✅ 生成
<函数名>_analysis.md分析报告 - ⚠️ 只有该文件的汇编和语义解释,无优化级别对比
直接分析模式
不使用交互菜单,直接分析指定函数:
# 基本用法
# 指定输出目录
# 启用详细日志
Shell 补全
生成并安装 shell 补全脚本:
# Bash
# Fish
# Zsh
# PowerShell
📊 输出示例
多文件对比报告示例
生成的 Matrix_add_comparison.md 文件格式:
🏗️ 项目结构
🏗️ 项目结构
alaz/
├── src/
│ ├── main.rs # 命令行入口和交互模式
│ ├── lib.rs # 库入口
│ ├── instruction.rs # 指令定义和解释
│ ├── register.rs # 寄存器定义
│ ├── parser.rs # 汇编代码解析器
│ ├── semantic.rs # 语义分析器
│ ├── objdump.rs # objdump 文件解析
│ ├── table.rs # 表格生成器
│ └── error.rs # 错误类型定义
├── aarch64_instructions.json # 指令集定义
├── Cargo.toml # 项目配置
└── README.md # 项目文档
🔧 技术细节
支持的指令类型
1. 数据处理指令
- 算术运算: ADD, SUB, MUL, MADD, MSUB, SDIV, UDIV
- 逻辑运算: AND, ORR, EOR, BIC
- 移位操作: LSL, LSR, ASR, ROR
2. 加载存储指令
- 加载: LDR, LDRB, LDRH, LDRSB, LDRSH, LDP
- 存储: STR, STRB, STRH, STP
3. 分支指令
- 无条件分支: B, BL, BR, BLR, RET
- 条件分支: B.cond (EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL)
- 比较分支: CBZ, CBNZ, TBZ, TBNZ
4. 比较指令
- CMP, CMN, TST, TEQ
5. 移动指令
- MOV, MOVZ, MOVK, MOVN, MVN
6. 其他指令
- NOP, ADRP, ADR, SXTW, UXTW
寄存器说明
通用寄存器
- 64位: X0-X30 (31个寄存器)
- 32位: W0-W30 (X寄存器的低32位)
特殊寄存器
- SP: 栈指针 (Stack Pointer)
- X29/FP: 帧指针 (Frame Pointer)
- X30/LR: 链接寄存器 (Link Register)
- PC: 程序计数器 (Program Counter)
- XZR/WZR: 零寄存器 (读取返回0,写入被忽略)
寻址模式
[Xn] # 基址寻址
[Xn, #imm] # 基址+偏移
[Xn, #imm]! # 前索引 (先更新基址,再访问)
[Xn], #imm # 后索引 (先访问,再更新基址)
[Xn, Xm] # 寄存器偏移
[Xn, Wm, uxtw #3] # 扩展寄存器偏移
🎨 语义解释示例
ALAZ 会为每条指令生成详细的中文语义解释:
| 指令 | 语义解释 |
|---|---|
sub sp, sp, #0x30 |
分配48字节栈空间 |
stp x29, x30, [sp, #-64]! |
将x29和x30压栈(前索引,先sp-=64再存储) |
ldr x0, [sp, #24] |
从sp+24地址加载8字节到x0 |
add w0, w1, w2 |
w0 = w1 + w2 |
csel x0, x1, x2, eq |
条件选择,如果相等选择x1,否则选择x2 |
adrp x0, label |
将PC相对页地址加载到x0(用于访问全局变量) |
fmla v0.4s, v1.4s, v2.4s |
浮点融合乘加,v0 = v0 + v1 * v2 |
ldadd w1, w2, [x0] |
原子加法,将w1的值加到内存[x0],原值加载到w2 |
cmp x0, #0 |
比较x0与0,更新条件标志 |
b.eq 1234 |
如果相等(Z=1)则跳转到0x1234 |
bl function |
调用函数(保存返回地址到LR) |
ret |
返回(跳转到LR保存的地址) |
🆕 v0.1.1 更新内容
新增指令支持(+78条)
- 条件操作:
csel,csinc,csinv,csneg,cset,csetm,cinc,cinv,cneg,ccmp,ccmn - PC相对寻址:
adr,adrp- 访问全局变量和 GOT/PLT - 位域操作:
ubfiz,sbfiz,extr- 高效位操作 - 浮点高级指令 (21条):
- 融合乘加:
fmla,fmls - 最值:
fmin,fmax,fminnm,fmaxnm - 转换:
fcvtas,fcvtau,fcvtms,fcvtmu,fcvtns,fcvtnu,fcvtps,fcvtpu - 取整:
frinta,frinti,frintm,frintn,frintp,frintx,frintz
- 融合乘加:
- SIMD 数据处理 (17条):
- 向量累加:
uaddlv,saddlv - 元素操作:
ins,dup,cnt - 饱和运算:
sqadd,uqadd,sqsub,uqsub - 移位:
shl,sshr,ushr - 扩展:
sxtl,uxtl - 交错:
uzp2,trn2
- 向量累加:
- 原子操作扩展 (12条):
ldaddh,ldaddb,casa,casb,cash,casp,stadd, 等 - 独占访问扩展 (10条):
ldxrb,ldxrh,stxrb,stxrh,ldaxrb,ldaxrh,ldxp,stxp, 等 - 异常处理:
eret,drps
改进
- ✅ 修复了指令数据库加载问题(从 115 条扩展到 237 条)
- ✅ 优化了 JSON 数据库结构,支持灵活的指令分类
- ✅ 改进了语义解释系统,更准确的中文描述
- ✅ 增强了 Parser 对复杂指令格式的支持
📚 使用场景
1. 编译优化分析
比较不同优化级别下的代码生成差异:
# 查看 O0/O1/O2 的优化差异
2. 学习汇编语言
通过语义解释快速理解汇编指令:
# 浏览并学习每条指令的含义
3. 性能调优
分析热点函数的汇编实现:
4. 代码审查
生成可读性强的汇编报告用于代码审查:
🤝 贡献
欢迎贡献!以下是一些可以改进的方向:
-
添加更多 AArch64 指令支持- v0.1.1 已支持 237 条指令 - 支持更多浮点和 SIMD 指令变体
- 添加 SVE (可伸缩向量扩展) 指令支持
- 添加性能统计功能(指令计数、周期估算)
- 支持其他架构(x86-64, RISC-V等)
- 添加图形化界面
- 支持更多输出格式(HTML, PDF等)
- 添加指令搜索和过滤功能
提交流程
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
📊 项目统计
- 指令支持: 237 条 AArch64 指令
- 代码行数: ~3000+ 行 Rust 代码
- 测试覆盖: 核心功能单元测试
- 文档: 完整的 JSON 指令数据库
📄 许可证
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
🙏 致谢
- ARM Architecture Reference Manual
- Rust 社区
- Clap 命令行解析库
- Colored 终端颜色库
📞 联系方式
- 作者: xjz
- Issues: GitHub Issues
Happy Analyzing! 🎉