Crate assembler

source ·
Expand description

#assembler

This is a new code base to efficiently assemble 64-bit x86 (AMD64 long mode) machine code at runtime.

Instructions are emitted by using the mnemonic-like methods on the InstructionStream. These are designed to work with Rust’s release build optimizations to compile down to just a sequence of byte stores to memory.

In addition, labels are supported; use of short (8-bit) labelled jumps is supported, and, where possible, are used.

Example Usage

extern crate assembler;

use ::assembler::*;
use ::assembler::mnemonic_parameter_types::BranchHint;
use ::assembler::mnemonic_parameter_types::Label;
use ::assembler::mnemonic_parameter_types::memory_operands::*;
use ::assembler::mnemonic_parameter_types::immediates::*;
use ::assembler::mnemonic_parameter_types::registers::*;

fn main()
{
	// SOME_LENGTH will be rounded up to the nearest power of two, with a minimum of the page size (4Kb).
	const SOME_LENGTH: usize = 4096;
	let memory_map = ExecutableAnonymousMemoryMap::new(SOME_LENGTH).unwrap();

	const SOME_LIKELY_NUMBER_OF_LABELS: usize = 512;
	let instruction_stream = memory_map.instruction_stream(SOME_LIKELY_NUMBER_OF_LABELS);

	instruction_stream.mov_...();

	let label = instruction_stream.create_and_attach_label();

	instruction_stream.jmp_Label(label)?;

	let function_pointer = instruction_stream.nullary_function::<()>():

	instruction_stream.finish();

	function_pointer();
}

Modules

Mnemonic parameter types.

Structs

Represents an executable memory map that can be used to generate program code into.
An instruction stream.
Hints to use when creating an instruction stream.

Enums

Errors from trying to instantiate an ExecutableAnonymousMemoryMap.

Type Definitions

An instruction pointer.
Represents the result of attempting a mnemonic with a short jump.