import sys

from capstone import CS_ARCH_X86, CS_MODE_64, Cs

BASE = 0x140000000


def main():
    dump = open(sys.argv[1], "rb").read()
    va = int(sys.argv[2], 16)
    count = int(sys.argv[3]) if len(sys.argv) > 3 else 30
    off = va - BASE

    md = Cs(CS_ARCH_X86, CS_MODE_64)
    print(f"== {sys.argv[1]} @ {va:#x} ==")
    for i, insn in enumerate(md.disasm(dump[off:off + 16 * count], va)):
        raw = " ".join(f"{b:02x}" for b in insn.bytes)
        print(f"  {insn.address:#012x}  {raw:<28}  {insn.mnemonic} {insn.op_str}".rstrip())
        if i + 1 >= count:
            break


if __name__ == "__main__":
    main()
