Type Definition iced_x86::FastFormatter
source · [−]pub type FastFormatter = SpecializedFormatter<DefaultFastFormatterTraitOptions>;
Expand description
Fast formatter with less formatting options and with a masm-like syntax. Use it if formatting speed is more important than being able to re-assemble formatted instructions.
This is a variant of SpecializedFormatter<TraitOptions>
and allows changing the
formatter options at runtime and the use of a symbol resolver. For fastest possible
disassembly and smallest code, the options should be hard coded, so see SpecializedFormatter<TraitOptions>
.
This formatter is ~2.8x faster than the gas/intel/masm/nasm formatters (the time includes decoding + formatting).
Examples
use iced_x86::*;
let bytes = b"\x62\xF2\x4F\xDD\x72\x50\x01";
let mut decoder = Decoder::new(64, bytes, DecoderOptions::NONE);
let instr = decoder.decode();
let mut output = String::new();
let mut formatter = FastFormatter::new();
formatter.options_mut().set_space_after_operand_separator(true);
formatter.format(&instr, &mut output);
assert_eq!(output, "vcvtne2ps2bf16 zmm2{k5}{z}, zmm6, dword bcst [rax+4h]");
Using a symbol resolver
use iced_x86::*;
use std::collections::HashMap;
let bytes = b"\x48\x8B\x8A\xA5\x5A\xA5\x5A";
let mut decoder = Decoder::new(64, bytes, DecoderOptions::NONE);
let instr = decoder.decode();
struct MySymbolResolver { map: HashMap<u64, String> }
impl SymbolResolver for MySymbolResolver {
fn symbol(&mut self, _instruction: &Instruction, _operand: u32, _instruction_operand: Option<u32>,
address: u64, _address_size: u32) -> Option<SymbolResult> {
if let Some(symbol_string) = self.map.get(&address) {
// The 'address' arg is the address of the symbol and doesn't have to be identical
// to the 'address' arg passed to symbol(). If it's different from the input
// address, the formatter will add +N or -N, eg. '[rax+symbol+123]'
Some(SymbolResult::with_str(address, symbol_string.as_str()))
} else {
None
}
}
}
// Hard code the symbols, it's just an example!😄
let mut sym_map: HashMap<u64, String> = HashMap::new();
sym_map.insert(0x5AA55AA5, String::from("my_data"));
let mut output = String::new();
let resolver = Box::new(MySymbolResolver { map: sym_map });
let mut formatter = FastFormatter::try_with_options(Some(resolver)).unwrap();
formatter.format(&instr, &mut output);
assert_eq!("mov rcx,[rdx+my_data]", output);