#jit #assembler #dynasm #dynasmrt #dynasm-rs


A simple runtime for assembling code at runtime. Combined with the plugin crate dynasm it can be used to write JIT compilers easily.

22 unstable releases (6 breaking)

0.6.0 Feb 24, 2020
0.5.2 Nov 22, 2019
0.5.1 Sep 15, 2019
0.3.1 Jan 19, 2019
0.0.6 Oct 27, 2016

#1 in Emulators

Download history 2737/week @ 2019-12-15 642/week @ 2019-12-22 671/week @ 2019-12-29 3409/week @ 2020-01-05 3671/week @ 2020-01-12 1705/week @ 2020-01-19 1180/week @ 2020-01-26 1672/week @ 2020-02-02 1297/week @ 2020-02-09 1911/week @ 2020-02-16 2643/week @ 2020-02-23 2506/week @ 2020-03-01 3355/week @ 2020-03-08 3603/week @ 2020-03-15 3863/week @ 2020-03-22 3347/week @ 2020-03-29

8,016 downloads per month
Used in 22 crates (6 directly)

MPL-2.0 license

1.5K SLoC

A Dynamic assembler written in Rust for Rust.

The purpose of this tool is to ease the creation of programs that require run-time assembling.

It is currently in beta, meaning that everything is operational, but some APIs might change in the future.

Build Status

#dynasm-rs on irc.mozilla.org


  • Fully integrated in the rust toolchain, no other tools necessary.
  • The assembly is optimized into a series of Vec.push and Vec.extend statements.
  • Errors are almost all diagnosed at compile time in a clear fashion.
  • Write the to be generated assembly inline in nasm-like syntax using a simple macro.


Documentation can be found here.

Architecture support

  • Supports the x64/x86 instruction sets in long and protected mode with every AMD/Intel/VIA extension except for AVX-512.
  • Supports the aarch64 instruction set up to ARMv8.4 except for SVE instructions. The development of this assembler backend has been generously sponsored by the awesome folks at Wasmer!



extern crate dynasmrt;

use dynasmrt::{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!";

        ; ->hello:
        ; .bytes string.as_bytes()

    let hello = ops.offset();
        ; 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 {


pub extern "win64" fn print(buffer: *const u8, length: u64) -> bool {
    io::stdout().write_all(unsafe {
        slice::from_raw_parts(buffer, length as usize)


This project is heavily inspired by Dynasm


The development of the Aarch64 assembler backend has been sponsored by Wasmer.


Mozilla Public License, v. 2.0, see LICENSE

Copyright 2016 CensoredUsername

Guaranteed to be working compiler versions

This project used to be a compiler plugin, so for old compilers, here's a list of which version of dynasm was guaranteed to work with which compiler. As the project has since transitioned to be a proc macro, this is not relevant for modern versions of the compiler.

  • 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)