alaz 0.1.1

AArch64 汇编语言分析工具 - 支持237条指令、多优化级别对比、智能语义解释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
# ALAZ - Assembly Language Analyzer

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Rust](https://img.shields.io/badge/rust-1.70+-orange.svg)](https://www.rust-lang.org/)
[![Crates.io](https://img.shields.io/crates/v/alaz.svg)](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 优化级别
| 地址 | 机器码 | 汇编指令 | 语义解释 | 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,写入被忽略)

### 寻址模式

```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! 🎉**