#jit-compiler #assembly #jit #compiler-plugin #dynasm-rs #dynasmrt

dynasm

一个用于在运行时汇编代码的插件。与运行时包 dynasmrt 结合使用,可以轻松编写JIT编译器。

33个版本 (8个稳定版)

2.0.0 2023年1月31日
1.2.3 2022年3月31日
1.2.1 2021年12月19日
1.2.0 2021年11月19日
0.0.6 2016年10月27日

过程宏 中排名 70

Download history 17969/week @ 2024-04-22 17932/week @ 2024-04-29 23867/week @ 2024-05-06 25176/week @ 2024-05-13 25221/week @ 2024-05-20 24791/week @ 2024-05-27 25746/week @ 2024-06-03 18485/week @ 2024-06-10 21141/week @ 2024-06-17 15450/week @ 2024-06-24 13598/week @ 2024-07-01 15461/week @ 2024-07-08 19792/week @ 2024-07-15 14973/week @ 2024-07-22 18468/week @ 2024-07-29 44431/week @ 2024-08-05

每月下载量 98,578
用于 153 个crate(24个直接使用)

MPL-2.0 许可协议

795KB
17K SLoC

用Rust编写的Rust动态汇编器。

此工具的目的是简化需要运行时汇编的程序创建。

与稳定的 rustc 1.45及更高版本兼容。

Build status

##dynasm-rs 在irc.libera.chat上

功能

  • 完全集成在Rust工具链中,无需其他工具。
  • 汇编被优化为一系列 Vec.pushVec.extend 语句。
  • 错误几乎都在编译时以清晰的方式诊断。
  • 使用简单的宏,以nasm-like语法在行内编写要生成的汇编。

文档

文档发布说明

架构支持

  • 支持x64/x86指令集在长模式和保护模式下,包括AMD/Intel/VIA的所有扩展(除了AVX-512)。
  • 支持ARMv8.4及以下版本的aarch64指令集(除了SVE指令)。此汇编器后端的开发得到了Wasmer团队的慷慨赞助!

示例

use dynasmrt::{dynasm, DynasmApi, DynasmLabelApi};

use std::{io, slice, mem};
use std::io::Write;

fn main() {
    let mut ops = dynasmrt::x64::Assembler::new().unwrap();
    let string = "Hello World!";

    dynasm!(ops
        ; .arch x64
        ; ->hello:
        ; .bytes string.as_bytes()
    );

    let hello = ops.offset();
    dynasm!(ops
        ; .arch x64
        ; lea rcx, [->hello]
        ; xor edx, edx
        ; mov dl, BYTE string.len() as _
        ; mov rax, QWORD print as _
        ; sub rsp, BYTE 0x28
        ; call rax
        ; add rsp, BYTE 0x28
        ; ret
    );

    let buf = ops.finalize().unwrap();

    let hello_fn: extern "win64" fn() -> bool = unsafe { mem::transmute(buf.ptr(hello)) };

    assert!(hello_fn());
}

pub extern "win64" fn print(buffer: *const u8, length: u64) -> bool {
    io::stdout()
        .write_all(unsafe { slice::from_raw_parts(buffer, length as usize) })
        .is_ok()
}

背景

该项目深受Dynasm的启发。

赞助

Aarch64汇编器后端的开发得到了Wasmer的赞助。

许可协议

Mozilla公共许可协议,版本2.0,请参阅LICENSE

版权所有 2016 CensoredUsername

保证可正常工作的编译器版本

该项目曾是一个编译器插件,因此对于旧编译器,这里列出了哪些版本的 dynasm 可以与哪些编译器兼容。由于项目已经过渡到进程宏,这对于编译器的现代版本不再相关。

  • v0.2.0: rustc 1.27.0-nightly (ac3c2288f 2018-04-18)
  • v0.2.1: rustc 1.28.0-nightly (a1d4a9503 2018-05-20)
  • v0.2.3: rustc 1.31.0-nightly (96cafc53c 2018-10-09)

依赖项

~2MB
~41K SLoC