17 个版本
0.3.0 | 2024 年 6 月 25 日 |
---|---|
0.2.5 | 2024 年 3 月 10 日 |
0.2.4 | 2023 年 11 月 2 日 |
0.2.3 | 2022 年 1 月 2 日 |
0.0.3 | 2020 年 3 月 15 日 |
#150 在 解析器实现
2,620 每月下载量
在 9 个crate中(5 个直接使用)
1MB
16K SLoC
yaxpeax-arm
yaxpeax-arm
为 armv7、v7/thumb、v7/thumb2 和 aarch64/a64 指令集提供解码器实现。
解码的入口点是 armv7::InstDecoder
(《code>ARMv7::Decoder::default())或 armv8::InstDecoder
(《code>ARMv8::Decoder::default())。两个解码器的默认模式都是解码 ARM 模式。默认模式会尽可能宽松地进行解码,甚至在可能的情况下尝试为 UNPREDICTABLE
模式生成某种指令。对于 armv7 及以下版本,default_thumb
会生成一组类似宽松的规则,但用于解码 thumb/thumb2 指令。
ARMv7 和 thumb 模式的指令解码为相同的结构:armv7::Instruction
。这不会引入歧义,如果您必须区分 thumb 和非 thumb 的来源,armv7::Instruction::thumb
将反映解码器在解码目标指令时的状态。此外,armv7::Instruction::w
报告指令是否是宽(32 位)thum 指令。
对于所有 ARMv7 指令,armv7::Instruction::s()
报告指令是否会更新状态标志。如果 s
出错,则表示解码器存在错误,请报告。
特性
#[无 std]
- 非常快
- 非常小?
#[无 std]
yaxpeax-arm
支持在 no_std
环境中使用。要在 no_std
环境中构建 yaxpeax-arm
,请将 default-features = false
添加到 crate 的依赖项行。这将禁用 std
功能,并移除 yaxpeax-arm
可选提供的与 std
的小部分集成。
非常快
yaxpeax-arm
尚未进行彻底的基准测试,但初步测试表明,它的速度至少与其他高质量的 arm
反汇编器一样快,如 capstone
或 bad64
。更多全面的基准测试将陆续进行。
非常小?
与解码速度类似,编译后的 yaxpeax-arm
的大小尚未进行详细分析,但至少是 yaxpeax-x86
的 20%,armv7
和 armv8
代码完全独立 - 只使用一个架构应允许消除另一个架构的代码。 yaxpeax-arm
仅在几秒钟内以发布模式编译。
稳定性
0.1 和 1.0 版本是功能完整性稳定性的重要指标。以下列出了将 yaxpeax-arm
认为稳定的具体指南。
0.1 检查清单
- 支持
NEON
(ARMv8 中支持 SVE 之前的 SIMD!) - 调整
yaxpeax-arch
,以便min_length
可以根据InstDecoder
的模式而变化- 目前
min_length
总是 4,这对于Thumb
模式是不正确的。相反,选择 "2" 对于ARM
模式将是明显错误的。
- 目前
- 解决所有树内 TODO
1.0 检查清单
- 支持
SVE
和SVE2
- 支持按版本解码标志,以便解码 armv4、armv5 或 armv7 指令
- 完全支持
should_is_must
以控制如何进行严格解码 - 如果需要,完全支持将
unpredictable
编码报告为DecodeError::Unpredictable
- 彻底测试 armv7 和 armv8 指令与其他解码器的兼容性
- 现有的 thumb 测试套件是从枚举 thumb 指令派生出来的,但缺少一些
! 注意用户!
- armv7 NEON 支持尚不存在
架构说明
寄存器名称
名称 | 映射到 | 含义 |
---|---|---|
r0-r15 | r0-r15 | 这些是寄存器! |
a1-a4 | r0-r3 | 参数、结果或临时寄存器 |
v1-v8 | r4-r11 | 变量寄存器 |
sb | r9 | 静态基寄存器 |
fp | r11 | 栈指针 |
ip | r12 | 过程调用寄存器 |
sp | r13 | 堆栈指针 |
lr | r14 | 链接寄存器 |
pc | r15 | 程序计数器 |
* fp
在 ARM 文档中似乎没有明确引用,且映射到 r11 看起来是操作系统(Windows/Linux?)的约定。
依赖项
~1.5MB
~31K SLoC