Crate csx64[][src]

CSX64 is effectively a cross-platform, custom 64-bit processor emulator featuring its own execution engine, machine code, assembly language, and linker. It was originally intended to be an educational tool to teach assembly programming in a safe, well-defined, platform-independent framework. This crate contains only the CSX64 library code (no application/cli).

Example of Usage

// an example program just to show the assemble/link/execute process
let prog_name = "demo.asm";
let prog = r"
    global main
 
    segment text
    main:
        mov edi, 5
        mov esi, 4
        add edi, esi
         
        mov eax, edi
        ret
";
 
// assemble the assembly program into an object file
let obj = match asm::assemble(prog_name, &mut prog.as_bytes(), Default::default()) {
    Ok(obj) => obj,
    Err(e) => panic!("{}", e), // assemble errors (above program has no errors)
};
 
// get a copy of the C standard library object files (implemented in CSX64 assembly)
let mut objs = asm::stdlib();
objs.push((String::from(prog_name), obj)); // add our object file(s) to the end
 
// link the object files into an executable - we want the starting point to be `main`
let exe = match asm::link(objs, Some(("start", "main"))) {
    Ok(exe) => exe,
    Err(e) => panic!("{}", e), // link errors (above program has no errors)
};
 
// create an emulator, load up the executable, and execute
let mut emu = exec::Emulator::new();
emu.init(&exe, &Default::default());
let (_, state) = emu.execute_cycles(u64::MAX);
assert_eq!(state, exec::StopReason::Terminated(9)); // should terminate with result 9

Modules

asm

Everything pertaining to the creation of CSX64 shared object files, object files, and executables.

common

Everything needed for both assembly and execution.

exec

Everything pertaining to executing CSX64 executables.