// asm.rs use std::error::Error; use iced_x86::{code_asm::*, Formatter, Instruction, NasmFormatter}; pub fn assemble(addr: u64, op: F) -> Result, Box> where F: Fn(&mut CodeAssembler) -> Result<(), Box>, { let mut asm = CodeAssembler::new(64)?; _ = op(&mut asm); Ok(asm.assemble(addr)?) } pub trait InstructionFormat { fn fmt_line(&self, formatter: &mut dyn Formatter) -> Result>; fn fmt_line_default(&self) -> Result>; } impl InstructionFormat for Instruction { fn fmt_line(&self, formatter: &mut dyn Formatter) -> Result> { let mut asm_str = String::new(); formatter.format(self, &mut asm_str); Ok(format!( "{:#016x}[{:02}] {}", self.ip(), self.len(), asm_str )) } fn fmt_line_default(&self) -> Result> { let mut fmt = NasmFormatter::new(); self.fmt_line(&mut fmt) } }