#assembly #jit #dynasm #directasm #dynasm-rs

dynasm-lib

一个纯Rust汇编器,不是JIT。在direct-asm中使用,以获得最大的汇编控制。

1个不稳定版本

0.1.0-alpha2020年7月2日

#31 in #jit

Download history 98/week @ 2023-11-20 100/week @ 2023-11-27 73/week @ 2023-12-04 72/week @ 2023-12-11 13/week @ 2023-12-18 4/week @ 2023-12-25 13/week @ 2024-01-01 74/week @ 2024-01-08 54/week @ 2024-01-15 95/week @ 2024-01-22 75/week @ 2024-01-29 44/week @ 2024-02-05 64/week @ 2024-02-12 58/week @ 2024-02-19 84/week @ 2024-02-26 100/week @ 2024-03-04

307 每月下载量
用于 direct-asm

MPL-2.0 许可证

770KB
16K SLoC

一个纯Rust汇编器,不是JIT。在direct-asm中使用,以获得最大的汇编控制。

这个crate实现了将汇编统一解析为指令、标签、表达式和一些架构(x86、x86_64、aarch64 WIP)的后端。它不是完全的Intel语法(但很接近),因为它应该能够嵌入环境中的表达式,我们将它们视为不可操作的任意不透明值。

没有全局状态,我们也不假设在proc-macro中执行,但这是一种可能的嵌入方式。在这种情况下,我们可以 组合 表达式,但不能评估它们。例如,要嵌入一些 A: u8,其三个最低位给出输出字节最高三位的一个索引,我们要求环境为 (A & 0x7) << 5 生成一个新的表达式。这将在const eval后得到正确的结果,而不需要我们自己检查 A 的值。有了足够的这些组合器,我们可以完成汇编所需的全部操作。

这是一个正在进行中的重工作,欢迎任何贡献。解析器、新架构、更好的诊断。

限制:从环境 插入 指针和其他重定位不是容易的,甚至是不可能的。我们可以直接插入一个指针,这将不允许纯字节切片作为输出,并且需要一个实际的 struct 或复杂的枚举。然而,指针的位置必须在以后由链接器替换,它有一个描述MIR const eval中位置的替换值,因此我们可以检查其字节或插入关于它的复合算术表达式。这必须在运行时评估。(在一个非常愚蠢的举动中,我们会修改链接脚本以执行这个算术,但我们还不能这样做,基本功能应该在那时工作。另一个选择是编译器接口,对此有一些同情,但没有正式或具体的东西。)

依赖项

~215KB