#x86-64 #assembly #nasm

x64asm

用于从 Rust 编写 x64 汇编代码的库,更确切地说

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 次下载

MIT 许可证

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 的启发。

无运行时依赖