macroassembler 1.0.5

A library for writing portable x86-64/riscv64/aarch64 assembly code in Rust
Documentation
#[allow(unused_unsafe)]
pub unsafe fn try_to_disassemble<W: std::fmt::Write>(
    code: *const u8,
    size: usize,
    prefix: &str,
    out: &mut W,
) -> std::fmt::Result {
    let _ = code;
    let _ = size;
    let _ = prefix;
    let _ = out;
    #[cfg(all(feature="x86-disasm", target_arch = "x86_64"))]
    unsafe {
        use super::assembly_comments::AssemblyCommentsRegistry;

        use iced_x86::*;
        let code = std::slice::from_raw_parts(code, size);
        let mut decoder = Decoder::with_ip(64, code, code.as_ptr() as _, DecoderOptions::NONE);

        let mut formatter = GasFormatter::new();
        formatter
            .options_mut()
            .set_gas_show_mnemonic_size_suffix(true);
        formatter.options_mut().set_uppercase_hex(false);
        for instruction in &mut decoder {
            let mut output = String::new();
            formatter.format(&instruction, &mut output);
            write!(out, "{}0x{:x}: {}", prefix, instruction.ip(), output)?;

            if let Some(comment) = AssemblyCommentsRegistry::singleton().comment(instruction.ip() as _) {
                write!(out, "; {}\n", comment)?;
            } else {
                write!(out, "\n")?;
            }
        }
    }

    #[cfg(target_arch = "riscv64")]
    unsafe {
        super::riscv64disassembler::try_to_disassemble(
            std::slice::from_raw_parts(code, size),
            prefix,
            code as u64,
            out,
        )?;
    }

    #[cfg(all(feature="arm-disasm", target_arch="aarch64"))]
    {
        use capstone::prelude::*;

        let cs = Capstone::new()
            .arm64()
            .mode(arch::arm64::ArchMode::Arm)
            .detail(true)
            .build()
            .expect("failed to create Capstone object");

        let code = std::slice::from_raw_parts(code, size);
        
        let insns = cs.disasm_all(code, code.as_ptr() as _).expect("failed to disassemble");

        for insn in insns.iter() {
            write!(out, "{}0x{:x}: {} {}\n", prefix, insn.address(), insn.mnemonic().unwrap(), insn.op_str().unwrap())?;
        }
    }

    Ok(())
}