2 releases
| 0.1.1 | Feb 15, 2026 |
|---|---|
| 0.1.0 | Feb 15, 2026 |
#246 in Development tools
Used in asm-rs-macros
1.5MB
43K
SLoC
asm-rs
A pure Rust multi-architecture assembly engine for offensive security.
๐ Documentation ยท ๐ API Reference ยท ๐ฆ Crate
Zero
unsafe,no_std-compatible, designed for embedding in exploit compilers, JIT engines, security tools, and shellcode generators.
โจ Features
- ๐ฆ Pure Rust โ
#![forbid(unsafe_code)], no C dependencies - ๐ฆ
no_stdsupport โ embedded and WASM environments (withalloc) - ๐๏ธ Multi-architecture โ x86, x86-64, ARM32, Thumb/Thumb-2, AArch64, RISC-V
- ๐ Intel & AT&T syntax โ full GAS-compatible AT&T with
.syntax att/.syntax intel - ๐ท๏ธ Labels & constants โ forward/backward references, numeric labels,
.equ/.set - ๐ Branch relaxation โ Szymanski's algorithm for optimal branch encoding
- ๐ Preprocessor โ
.macro/.rept/.irp/.if/.ifdefdirectives - โก Peephole optimizer โ zero-idiom, MOV narrowing, REX elimination
- ๐ง Compile-time macros โ
asm_bytes!/asm_array!for zero-overhead assembly - ๐ฏ Literal pools โ
LDR Xn/Rn, =valuewith automatic pool management (AArch64/ARM32) - ๐ Listing output โ human-readable address/hex/source listing for debugging
- ๐ Applied relocations โ full relocation info exposed for tooling
- ๐งฌ Serde support โ optional serialization for all public types
๐๏ธ Supported Architectures
| Architecture | Variants | Highlights |
|---|---|---|
| x86 | 32-bit, 16-bit real mode | Full ISA, .code16/.code32 |
| x86-64 | 64-bit | SSEโSSE4.2, AVX/AVX2, AVX-512, AES-NI, BMI1/2, FMA3 |
| ARM32 | A32 (ARMv7) | Condition codes, barrel shifter, literal pools |
| Thumb | T16/T32 | Auto 16/32-bit encoding, IT blocks |
| AArch64 | A64 (ARMv8+) | NEON/AdvSIMD, LSE atomics, literal pools |
| RISC-V | RV32I, RV64I | M/A/C extensions, auto-compression |
๐ Quick Start
Add to your Cargo.toml:
[dependencies]
asm-rs = "0.1"
One-Shot Assembly
use asm_rs::{assemble, Arch};
let bytes = assemble("mov eax, 42\nret", Arch::X86_64).unwrap();
assert_eq!(bytes[0], 0xB8); // mov eax, imm32
Builder API
use asm_rs::{Assembler, Arch};
let mut asm = Assembler::new(Arch::X86_64);
asm.emit("push rbp").unwrap();
asm.emit("mov rbp, rsp").unwrap();
asm.emit("sub rsp, 0x20").unwrap();
// ... function body ...
asm.emit("add rsp, 0x20").unwrap();
asm.emit("pop rbp").unwrap();
asm.emit("ret").unwrap();
let result = asm.finish().unwrap();
println!("Generated {} bytes", result.len());
AT&T / GAS Syntax
use asm_rs::{Assembler, Arch, Syntax};
let mut asm = Assembler::new(Arch::X86_64);
asm.syntax(Syntax::Att);
asm.emit(r#"
pushq %rbp
movq %rsp, %rbp
movl $42, %eax
popq %rbp
ret
"#).unwrap();
Multi-Architecture Shellcode
use asm_rs::{Assembler, Arch};
// x86-64
let bytes = asm_rs::assemble("xor edi, edi; mov eax, 60; syscall", Arch::X86_64).unwrap();
// AArch64
let mut asm = Assembler::new(Arch::Aarch64);
asm.emit("mov x0, #0; mov x8, #93; svc #0").unwrap();
// ARM32
let mut asm = Assembler::new(Arch::Arm);
asm.emit("mov r0, #0; mov r7, #1; svc #0").unwrap();
// RISC-V
let bytes = asm_rs::assemble("li a7, 93; li a0, 0; ecall", Arch::Rv32).unwrap();
Compile-Time Assembly
use asm_rs_macros::{asm_bytes, asm_array};
const SHELLCODE: &[u8] = asm_bytes!(x86_64, "xor eax, eax; inc eax; ret");
const NOP: [u8; 1] = asm_array!(x86_64, "nop");
const ARM_CODE: &[u8] = asm_bytes!(arm, "bx lr");
See
crates/asm-rs-macros/README.mdfor full proc-macro documentation.
๐งช Testing
Extensive test suite covering unit, integration, cross-validation (llvm-mc, iced-x86, yaxpeax-arm, riscv-decode), property-based (proptest), and fuzz testing (cargo-fuzz). Zero warnings, Miri clean.
โ๏ธ Configuration
Cargo Features
| Feature | Default | Description |
|---|---|---|
std |
โ | Standard library support |
x86 |
โ | x86 (32-bit) backend |
x86_64 |
โ | x86-64 backend |
arm |
โ | ARM32 + Thumb/Thumb-2 backend |
aarch64 |
โ | AArch64 backend |
riscv |
โ | RISC-V backend |
avx |
โ | AVX/AVX2/FMA |
avx512 |
โ | AVX-512/EVEX |
neon |
โ | AArch64 NEON/AdvSIMD |
sve |
โ | AArch64 SVE |
riscv_f |
โ | RISC-V F/D floating-point |
riscv_v |
โ | RISC-V V vector |
serde |
โ | Serialize/Deserialize for public types |
MSRV
Rust 1.75 or later.
๐ Learn More
For the full reference โ architecture details, ISA instruction tables, directives, API docs, and configuration options โ visit the documentation site.
๐ License
Licensed under either of:
at your option.