32 个版本 (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日 |
在 编程语言 中排名 42
每月下载量 74,547
被 146 个 软件包使用 (34 个直接使用)
185KB
3.5K SLoC
用 Rust 编写的 Rust 动态汇编器。
此工具的目的是简化需要运行时汇编的程序创建。
它与稳定版 rustc
1.45 及更高版本兼容。
##dynasm-rs
在 irc.libera.chat 上
功能
- 完全集成在 Rust 工具链中,无需其他工具。
- 汇编被优化为一系列
Vec.push
和Vec.extend
语句。 - 错误几乎都在编译时以清晰的方式诊断。
- 使用简单的宏,以 nasm 类似语法内联编写要生成的汇编。
文档
架构支持
- 支持 x64/x86 指令集在长模式和保护模式下,除了 AVX-512 以外的每个 AMD/Intel/VIA 扩展。
- 支持 aarch64 指令集直到 ARMv8.4,除了 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 可以保证与哪些编译器兼容。由于项目已经转型为 proc macro,因此这对于编译器的现代版本不再相关。
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
约44K SLoC