From 5ee85aaa5dba85d2d03d613c976096fdde96095f Mon Sep 17 00:00:00 2001 From: Hendiadyoin1 Date: Thu, 7 Apr 2022 14:48:22 +0200 Subject: [PATCH] disasm: Print instruction bytes This prints 7 instruction bytes per line, which is enough for most x86-64 instructions (rex+opcode+mod/rm+imm32) and is also what objdump uses. Co-authored-by: Simon Wanner --- Userland/Utilities/disasm.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Userland/Utilities/disasm.cpp b/Userland/Utilities/disasm.cpp index 93ecd74845..63d214b1bf 100644 --- a/Userland/Utilities/disasm.cpp +++ b/Userland/Utilities/disasm.cpp @@ -130,7 +130,26 @@ ErrorOr serenity_main(Main::Arguments args) is_first_symbol = false; } - outln("{:p} {}", virtual_offset, insn.value().to_string(virtual_offset, symbol_provider)); + size_t length = insn.value().length(); + StringBuilder builder; + builder.appendff("{: 8x}:\t", virtual_offset); + for (size_t i = 0; i < 7; i++) { + if (i < length) + builder.appendff("{:02x} ", asm_data[offset + i]); + else + builder.append(" "sv); + } + builder.append("\t"sv); + builder.append(insn.value().to_string(virtual_offset, symbol_provider)); + outln("{}", builder.string_view()); + + for (size_t bytes_printed = 7; bytes_printed < length; bytes_printed += 7) { + builder.clear(); + builder.appendff("{:p} ", virtual_offset + bytes_printed); + for (size_t i = bytes_printed; i < bytes_printed + 7 && i < length; i++) + builder.appendff(" {:02x}", asm_data[offset + i]); + outln("{}", builder.string_view()); + } } return 0; }