10 个版本
0.2.0 | 2023 年 1 月 6 日 |
---|---|
0.1.9 | 2022 年 8 月 27 日 |
0.1.5 | 2022 年 7 月 23 日 |
0.1.3 | 2022 年 5 月 26 日 |
0.1.1 | 2022 年 4 月 25 日 |
#2 in #nasm
每月 25 次下载
21KB
481 行
x64asm
从 Rust 编写 x64 汇编代码的库,更确切地说。为 nasm 汇编器设计
如何使用
let instructions = vec![
i!(/* <mnemonic>, [operands, ...] */),
// other instructions
];
let code = instructions.to_assembly(/*separator (space or tab)*/);
// Writes to a file
let mut stream = File::create(&Path::new("output.asm")).unwrap();
write!(stream, "{}", code).unwrap();
安装
在您的 "Cargo.toml" 文件中
[dependencies]
x64asm = "*"
在 crates.io 上检查当前版本
示例
let instructions = vec![
i!(Global, oplabel!("_start")),
i!(section!(Text)),
i!(label!("_start")),
i!(Mov, reg!(Rax), Op::Literal(1)),
i!(Mov, reg!(Rdi), Op::Literal(1)),
i!(Mov, reg!(Rsi), oplabel!("msg")),
i!(Mov, reg!(Rdx), oplabel!("msg_len")),
i!(Syscall),
i!(Mov, reg!(Rax), Op::Literal(60)),
i!(Mov, reg!(Rdi), Op::Literal(0)),
i!(Syscall),
i!(section!(Data)),
i!(label!("msg"), dd!(Db), opstring!("Hello world")),
i!(label!("msg_len"), dd!(Equ), opexpr!("$ - msg")),
];
let code = instructions.to_assembly(Separator::Space);
let mut stream = File::create(&Path::new("output.asm")).unwrap();
write!(stream, "{}", code).unwrap();
示例的导入
use std::path::Path;
use std::fs::File;
use std::io::prelude::*;
use x64asm::convert::{ ToAssembly, Separator };
use x64asm::macros::*;
然后,生成的 "output.asm" 文件
global _start
section .text
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
mov rax, 60
mov rdi, 0
syscall
section .data
msg: db `Hello world`
msg_len: equ $ - msg
注意
最初受 GregoryComer/rust-x86asm 的启发。