alaz 0.1.0

Assembly Language Analyzer - AArch64 汇编语言分析工具,支持多优化级别对比和语义解释
Documentation

ALAZ - Assembly Language Analyzer

License: MIT Rust

ALAZ (Assembly Language Analyzer) 是一个强大的 AArch64 汇编语言分析工具,用于解析 objdump 输出文件并生成美观的 Markdown 分析报告。

✨ 功能特性

  • 🔍 智能解析: 自动解析 objdump 输出,提取汇编指令和源代码对应关系
  • 📊 多级对比: 支持 O0/O1/O2 三个优化级别的汇编代码对比分析
  • 🎯 语义解释: 自动生成每条指令的中文语义解释
  • 🎨 美观输出: 生成格式化的 Markdown 表格,便于阅读和分享
  • 🖥️ 交互模式: 提供友好的交互式菜单,快速浏览和选择函数
  • 📝 单文件分析: 支持对单个 dump 文件进行详细分析
  • 高性能: Rust 编写,解析速度快,资源占用低

📦 安装

从源码编译

# 克隆仓库
git clone https://github.com/xjz6626/Assembly-Language-Analyzer.git
cd Assembly-Language-Analyzer

# 编译并安装
cargo install --path .

# 或者只编译
cargo build --release
# 可执行文件位于 target/release/alaz

使用 Cargo 安装

cargo install alaz

🚀 快速开始

1. 准备 dump 文件

首先,使用 objdump 生成反汇编文件:

# 编译不同优化级别的代码
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. 交互式分析

# 多文件模式 - 分析三个优化级别的共同函数
alaz interactive matrix

# 单文件模式 - 只分析一个 dump 文件
alaz interactive -s matrix_O2.dump

3. 直接分析指定函数

# 分析 Matrix_add 函数,生成对比报告
alaz analyze Matrix_add matrix

# 指定输出目录
alaz analyze Matrix_mul matrix -o ./reports

📖 使用指南

命令概览

alaz --help              # 查看帮助信息
alaz interactive <FILE>  # 交互式模式
alaz analyze <FUNC> <PREFIX>  # 直接分析
alaz completions <SHELL>  # 生成补全脚本

交互式模式

多文件模式(默认)

分析三个优化级别的共同函数,生成对比报告:

# 使用文件前缀
alaz interactive matrix

# 或显式指定多文件模式
alaz interactive -m matrix

# 指定输出目录
alaz interactive matrix -o ./output

特点

  • ✅ 自动读取 matrix_O0.dump, matrix_O1.dump, matrix_O2.dump
  • ✅ 只显示在三个文件中都存在的函数
  • ✅ 生成 <函数名>_comparison.md 对比报告
  • ✅ 包含三个优化级别的完整对比

单文件模式

只分析一个 dump 文件:

# 分析 O2 优化级别的文件
alaz interactive -s matrix_O2.dump

# 分析 O0 优化级别的文件
alaz interactive -s matrix_O0.dump

特点

  • ✅ 显示该文件中的所有函数
  • ✅ 可以选择函数进行详细分析
  • ✅ 生成 <函数名>_analysis.md 分析报告
  • ⚠️ 只有该文件的汇编和语义解释,无优化级别对比

直接分析模式

不使用交互菜单,直接分析指定函数:

# 基本用法
alaz analyze Matrix_add matrix

# 指定输出目录
alaz analyze Matrix_mul matrix -o ./reports

# 启用详细日志
alaz analyze -v Matrix_inv matrix

Shell 补全

生成并安装 shell 补全脚本:

# 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 文件格式:

# Matrix_add 函数对比分析

## O0 优化级别
| 地址 | 机器码 | 汇编指令 | 语义解释 | C代码 |
|------|--------|----------|----------|-------|
| 0x1000 | 910003fd | sub sp, sp, #0x10 | 分配16字节栈空间 | { |
| 0x1004 | f9000fe0 | str x0, [sp, #24] | 保存参数x0到栈 | |

## O1 优化级别
| 地址 | 机器码 | 汇编指令 | 语义解释 | C代码 |
|------|--------|----------|----------|-------|
| ... | ... | ... | ... | ... |

## O2 优化级别
| 地址 | 机器码 | 汇编指令 | 语义解释 | C代码 |
|------|--------|----------|----------|-------|
| ... | ... | ... | ... | ... |

🏗️ 项目结构

🏗️ 项目结构

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. 编译优化分析

比较不同优化级别下的代码生成差异:

alaz interactive mycode
# 查看 O0/O1/O2 的优化差异

2. 学习汇编语言

通过语义解释快速理解汇编指令:

alaz interactive -s example.dump
# 浏览并学习每条指令的含义

3. 性能调优

分析热点函数的汇编实现:

alaz analyze hot_function mycode -o ./analysis

4. 代码审查

生成可读性强的汇编报告用于代码审查:

alaz analyze critical_function security_lib

🤝 贡献

欢迎贡献!以下是一些可以改进的方向:

  • 添加更多 AArch64 指令支持
  • 支持浮点和 SIMD 指令
  • 添加性能统计功能
  • 支持其他架构(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

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。

🙏 致谢

  • ARM Architecture Reference Manual
  • Rust 社区
  • Clap 命令行解析库
  • Colored 终端颜色库

📞 联系方式


Happy Analyzing! 🎉