Explorar o código

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 <skyrising@pvpctutorials.de>
Hendiadyoin1 %!s(int64=3) %!d(string=hai) anos
pai
achega
5ee85aaa5d
Modificáronse 1 ficheiros con 20 adicións e 1 borrados
  1. 20 1
      Userland/Utilities/disasm.cpp

+ 20 - 1
Userland/Utilities/disasm.cpp

@@ -130,7 +130,26 @@ ErrorOr<int> 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;
 }