# ALAZ - Assembly Language Analyzer
[](https://opensource.org/licenses/MIT)
[](https://www.rust-lang.org/)
[](https://crates.io/crates/alaz)
**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+条)
## 📦 安装
### 从源码编译
```bash
# 克隆仓库
git clone https://github.com/xjz6626/Assembly-Language-Analyzer.git
cd Assembly-Language-Analyzer
# 编译并安装
cargo install --path .
# 或者只编译
cargo build --release
# 可执行文件位于 target/release/alaz
```
### 使用 Cargo 安装
```bash
cargo install alaz
```
## 🚀 快速开始
### 1. 准备 dump 文件
首先,使用 `objdump` 生成反汇编文件:
```bash
# 编译不同优化级别的代码
gcc -O0 -g -c matrix.c -o matrix_O0.o
gcc -O1 -g -c matrix.c -o matrix_O1.o
gcc -O2 -g -c matrix.c -o matrix_O2.o
# 生成 dump 文件
objdump -d -S matrix_O0.o > matrix_O0.dump
objdump -d -S matrix_O1.o > matrix_O1.dump
objdump -d -S matrix_O2.o > matrix_O2.dump
```
### 2. 交互式分析
```bash
# 多文件模式 - 分析三个优化级别的共同函数
alaz interactive matrix
# 单文件模式 - 只分析一个 dump 文件
alaz interactive -s matrix_O2.dump
```
### 3. 直接分析指定函数
```bash
# 分析 Matrix_add 函数,生成对比报告
alaz analyze Matrix_add matrix
# 指定输出目录
alaz analyze Matrix_mul matrix -o ./reports
```
## 📖 使用指南
### 命令概览
```bash
alaz --help # 查看帮助信息
alaz interactive <FILE> # 交互式模式
alaz analyze <FUNC> <PREFIX> # 直接分析
alaz completions <SHELL> # 生成补全脚本
```
### 交互式模式
#### 多文件模式(默认)
分析三个优化级别的共同函数,生成对比报告:
```bash
# 使用文件前缀
alaz interactive matrix
# 或显式指定多文件模式
alaz interactive -m matrix
# 指定输出目录
alaz interactive matrix -o ./output
```
**特点**:
- ✅ 自动读取 `matrix_O0.dump`, `matrix_O1.dump`, `matrix_O2.dump`
- ✅ 只显示在三个文件中都存在的函数
- ✅ 生成 `<函数名>_comparison.md` 对比报告
- ✅ 包含三个优化级别的完整对比
#### 单文件模式
只分析一个 dump 文件:
```bash
# 分析 O2 优化级别的文件
alaz interactive -s matrix_O2.dump
# 分析 O0 优化级别的文件
alaz interactive -s matrix_O0.dump
```
**特点**:
- ✅ 显示该文件中的所有函数
- ✅ 可以选择函数进行详细分析
- ✅ 生成 `<函数名>_analysis.md` 分析报告
- ⚠️ 只有该文件的汇编和语义解释,无优化级别对比
### 直接分析模式
不使用交互菜单,直接分析指定函数:
```bash
# 基本用法
alaz analyze Matrix_add matrix
# 指定输出目录
alaz analyze Matrix_mul matrix -o ./reports
# 启用详细日志
alaz analyze -v Matrix_inv matrix
```
### Shell 补全
生成并安装 shell 补全脚本:
```bash
# Bash
alaz completions bash > ~/.local/share/bash-completion/completions/alaz
# Fish
alaz completions fish > ~/.config/fish/completions/alaz.fish
# Zsh
alaz completions zsh > ~/.zsh/completion/_alaz
# PowerShell
alaz completions powershell > alaz.ps1
```
## 📊 输出示例
### 多文件对比报告示例
生成的 `Matrix_add_comparison.md` 文件格式:
```markdown
# Matrix_add 函数对比分析
## O0 优化级别
| 0x1000 | 910003fd | sub sp, sp, #0x10 | 分配16字节栈空间 | { |
| 0x1004 | f9000fe0 | str x0, [sp, #24] | 保存参数x0到栈 | |
## O1 优化级别
| ... | ... | ... | ... | ... |
## O2 优化级别
| ... | ... | ... | ... | ... |
```
## 🏗️ 项目结构
## 🏗️ 项目结构
```
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,写入被忽略)
### 寻址模式
```assembly
[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. 编译优化分析
比较不同优化级别下的代码生成差异:
```bash
alaz interactive mycode
# 查看 O0/O1/O2 的优化差异
```
### 2. 学习汇编语言
通过语义解释快速理解汇编指令:
```bash
alaz interactive -s example.dump
# 浏览并学习每条指令的含义
```
### 3. 性能调优
分析热点函数的汇编实现:
```bash
alaz analyze hot_function mycode -o ./analysis
```
### 4. 代码审查
生成可读性强的汇编报告用于代码审查:
```bash
alaz analyze critical_function security_lib
```
## 🤝 贡献
欢迎贡献!以下是一些可以改进的方向:
- [x] ~~添加更多 AArch64 指令支持~~ - v0.1.1 已支持 237 条指令
- [ ] 支持更多浮点和 SIMD 指令变体
- [ ] 添加 SVE (可伸缩向量扩展) 指令支持
- [ ] 添加性能统计功能(指令计数、周期估算)
- [ ] 支持其他架构(x86-64, RISC-V等)
- [ ] 添加图形化界面
- [ ] 支持更多输出格式(HTML, PDF等)
- [ ] 添加指令搜索和过滤功能
### 提交流程
1. Fork 本仓库
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request
## 📊 项目统计
- **指令支持**: 237 条 AArch64 指令
- **代码行数**: ~3000+ 行 Rust 代码
- **测试覆盖**: 核心功能单元测试
- **文档**: 完整的 JSON 指令数据库
## 📄 许可证
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
## 🙏 致谢
- ARM Architecture Reference Manual
- Rust 社区
- Clap 命令行解析库
- Colored 终端颜色库
## 📞 联系方式
- 作者: xjz
- Issues: [GitHub Issues](https://github.com/xjz6626/Assembly-Language-Analyzer/issues)
---
**Happy Analyzing! 🎉**