#yaxpeax #decoder #instructions #manual #derived #module #itanium

no-std yaxpeax-ia64

属于yaxpeax项目的ia64解码器

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 编码


用于yaxpeax-dis

0BSD许可证

195KB
4.5K SLoC

yaxpeax-ia64

yaxpeax-ia64是作为yaxpeax项目的一部分实现的ia64(itanium)解码器。

yaxpeax-ia64实现了由yaxpeax-arch提供的特质,这可能是您从Rust使用此库的方式。 yaxpeax-ia64(目前)不知道ia-32/x86代码。对于x86,请参阅yaxpeax-x86protected_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);

InstructionBundleDisplay实现对于输出格式有一定的观点,它会将指令全部写在一行。对于更定制的显示格式(可能是某种多列布局?),您可能需要通过使用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