ALAZ - Assembly Language Analyzer
ALAZ (Assembly Language Analyzer) 是一个强大的 AArch64 汇编语言分析工具,用于解析 objdump 输出文件并生成美观的 Markdown 分析报告。
✨ 功能特性
- 🔍 智能解析: 自动解析 objdump 输出,提取汇编指令和源代码对应关系
- 📊 多级对比: 支持 O0/O1/O2 三个优化级别的汇编代码对比分析
- 🎯 语义解释: 自动生成每条指令的中文语义解释
- 🎨 美观输出: 生成格式化的 Markdown 表格,便于阅读和分享
- 🖥️ 交互模式: 提供友好的交互式菜单,快速浏览和选择函数
- 📝 单文件分析: 支持对单个 dump 文件进行详细分析
- ⚡ 高性能: Rust 编写,解析速度快,资源占用低
📦 安装
从源码编译
# 克隆仓库
# 编译并安装
# 或者只编译
# 可执行文件位于 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 |
将w1和w2相加,结果存入w0 |
cmp x0, #0 |
比较x0与0,更新条件标志 |
b.eq 1234 |
如果相等(Z=1)则跳转到0x1234 |
bl function |
调用函数(保存返回地址到LR) |
ret |
返回(跳转到LR保存的地址) |
📚 使用场景
1. 编译优化分析
比较不同优化级别下的代码生成差异:
# 查看 O0/O1/O2 的优化差异
2. 学习汇编语言
通过语义解释快速理解汇编指令:
# 浏览并学习每条指令的含义
3. 性能调优
分析热点函数的汇编实现:
4. 代码审查
生成可读性强的汇编报告用于代码审查:
🤝 贡献
欢迎贡献!以下是一些可以改进的方向:
- 添加更多 AArch64 指令支持
- 支持浮点和 SIMD 指令
- 添加性能统计功能
- 支持其他架构(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
📄 许可证
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
🙏 致谢
- ARM Architecture Reference Manual
- Rust 社区
- Clap 命令行解析库
- Colored 终端颜色库
📞 联系方式
- 作者: xjz
- Issues: GitHub Issues
Happy Analyzing! 🎉