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
每月下载量 98,578
用于 153 个crate(24个直接使用)
795KB
17K SLoC
用Rust编写的Rust动态汇编器。
此工具的目的是简化需要运行时汇编的程序创建。
与稳定的 rustc
1.45及更高版本兼容。
##dynasm-rs
在irc.libera.chat上
功能
- 完全集成在Rust工具链中,无需其他工具。
- 汇编被优化为一系列
Vec.push
和Vec.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