7个版本
0.2.1 | 2021年7月21日 |
---|---|
0.2.0 | 2021年7月7日 |
0.1.4 | 2021年5月7日 |
0.1.3 | 2021年1月16日 |
0.1.1 | 2020年10月12日 |
#1343 in 编码
195KB
4.5K SLoC
yaxpeax-ia64
yaxpeax-ia64是作为yaxpeax项目的一部分实现的ia64(itanium)解码器。
yaxpeax-ia64
实现了由yaxpeax-arch
提供的特质,这可能是您从Rust使用此库的方式。 yaxpeax-ia64
(目前)不知道ia-32/x86代码。对于x86,请参阅yaxpeax-x86
的protected_mode
模块,这是yaxpeax-ia64
可能使用的。
实现主要借鉴了截至2019-09-07的官方手册itanium-architecture-vol-1-2-3-4-reference-set-manual.pdf
,sha256: 705d2fc04ab378568eddb6bac4ee6974b6224b8efb5f73606f964f4a86e22955。
输入字节,输出指令 - 来自test.rs
let decoder = yaxpeax_ia64::InstDecoder::default();
let expected = "[MMI] ld1 r17=[r17];; nop.m 0x0; dep r14=r18,r14,0x0,0x8";
let data = [0x0a, 0x88, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x21, 0x71, 0xdc, 0x4f];
let inst = decoder.decode(data[..].iter().cloned()).unwrap();
assert_eq!(format!("{}", inst), expected);
InstructionBundle
的Display
实现对于输出格式有一定的观点,它会将指令全部写在一行。对于更定制的显示格式(可能是某种多列布局?),您可能需要通过使用InstructionBundle::instructions()
并独立处理指令来制作更聪明的东西。
特性
- 可能工作
- 几乎-
#[no_std]
- 存在
可能工作
我能找到的唯一解码库是GNU binutils
中的ia64解码器。我怀疑它是正确的,但考虑到指令集的大小、立即编码的细节和用户模式测试,可能存在一些解码错误!尽管如此,我预计yaxpeax-ia64
通常会正确或接近正确。
几乎-#[no_std]
yaxpeax-ia64
不引用 std::
,理论上 #[no_std]
就像在 lib.rs
中放置一个 #![no_std]
那么简单。我不期望在这个配置下构建或使用 yaxpeax-ia64
,因此出于避免额外的测试排列组合,它没有被启用。
如果您想在一个 no-std
配置中使用 yaxpeax-ia64
- 太棒了!应该不难
- 为什么?
- Rust 甚至没有将 ia64 作为第 3 级平台的目标,您是不是想获得 C 绑定?这也是一个好的说明
存在吗?
是的,我也很惊讶。其他的 Itanium 汇编器似乎只有 GNU binutils 中的一个,以及在 qemu-ia64
中可能有一个,但我不确定后者。
依赖项
~1MB
~28K SLoC