ckb_debugger/
instruction_decode.rs

1use crate::arch;
2use ckb_vm::machine::VERSION2;
3
4/// Print information about an instruction to assist humans in analysis. Get inspired by
5/// https://luplab.gitlab.io/rvcodecjs/.
6pub fn instruction_decode(inst: u32) {
7    let mut inst_tag = String::from("?");
8    let mut inst_isa = String::from("?");
9    if let Some(i) = ckb_vm::instructions::i::factory::<u64>(inst, VERSION2) {
10        assert_eq!(inst_tag.as_str(), "?");
11        let tagged_instruction = ckb_vm::instructions::tagged::TaggedInstruction::try_from(i).unwrap();
12        inst_tag = tagged_instruction.to_string();
13        inst_isa = "I".to_string();
14    }
15    if let Some(i) = ckb_vm::instructions::m::factory::<u64>(inst, VERSION2) {
16        assert_eq!(inst_tag.as_str(), "?");
17        let tagged_instruction = ckb_vm::instructions::tagged::TaggedInstruction::try_from(i).unwrap();
18        inst_tag = tagged_instruction.to_string();
19        inst_isa = "M".to_string();
20    }
21    if let Some(i) = ckb_vm::instructions::a::factory::<u64>(inst, VERSION2) {
22        assert_eq!(inst_tag.as_str(), "?");
23        let tagged_instruction = ckb_vm::instructions::tagged::TaggedInstruction::try_from(i).unwrap();
24        inst_tag = tagged_instruction.to_string();
25        inst_isa = "A".to_string();
26    }
27    if let Some(i) = ckb_vm::instructions::rvc::factory::<u64>(inst, VERSION2) {
28        assert_eq!(inst_tag.as_str(), "?");
29        let tagged_instruction = ckb_vm::instructions::tagged::TaggedInstruction::try_from(i).unwrap();
30        inst_tag = tagged_instruction.to_string();
31        inst_isa = "C".to_string();
32    }
33    if let Some(i) = ckb_vm::instructions::b::factory::<u64>(inst, VERSION2) {
34        assert_eq!(inst_tag.as_str(), "?");
35        let tagged_instruction = ckb_vm::instructions::tagged::TaggedInstruction::try_from(i).unwrap();
36        inst_tag = tagged_instruction.to_string();
37        inst_isa = "B".to_string();
38    }
39    arch::println(&format!("       Assembly = {}", inst_tag));
40    if inst_isa == "C" {
41        arch::println(&format!("         Binary = {:016b}", inst));
42        arch::println(&format!("    Hexadecimal = {:04x}", inst));
43    } else {
44        arch::println(&format!("         Binary = {:032b}", inst));
45        arch::println(&format!("    Hexadecimal = {:08x}", inst));
46    }
47    arch::println(&format!("Instruction set = {}", inst_isa));
48}