Crusader_Decomp/pyghidra_plans/dump_instruction_windows.py

76 lines
1.9 KiB
Python
Raw Normal View History

TARGETS = [
"0004:5b8c",
"0004:5bbf",
"0004:5ea7",
"0004:6430",
"0009:92ad",
"0009:b1cd",
"000a:493e",
"000a:4a68",
"000a:b9e5",
"000a:ba66",
"000d:9d5e",
"000d:a3b7",
]
BEFORE_COUNT = 6
AFTER_COUNT = 8
listing = program.getListing()
address_factory = program.getAddressFactory()
def as_address(text):
segment_text, offset_text = text.split(":")
return address_factory.getAddress(f"{segment_text}:{offset_text}")
def collect_window(center):
instructions = []
current = listing.getInstructionContaining(center)
if current is None:
current = listing.getInstructionAt(center)
if current is None:
current = listing.getInstructionBefore(center)
if current is not None and current.getNext() is not None and current.getNext().getAddress() <= center:
current = current.getNext()
if current is None:
return instructions
cursor = current
for _ in range(BEFORE_COUNT):
cursor = cursor.getPrevious()
if cursor is None:
break
if cursor is None:
cursor = current
while cursor.getPrevious() is not None and len(instructions) < BEFORE_COUNT:
cursor = cursor.getPrevious()
while cursor is not None:
instructions.append(cursor)
if cursor == current:
break
cursor = cursor.getNext()
cursor = current.getNext()
while cursor is not None and len(instructions) < BEFORE_COUNT + AFTER_COUNT + 1:
instructions.append(cursor)
cursor = cursor.getNext()
return instructions
for target_text in TARGETS:
target = as_address(target_text)
print(f"=== {target} ===")
window = collect_window(target)
if not window:
print("<no instruction window>\n")
continue
for insn in window:
marker = "=>" if insn.getAddress() == target else " "
print(f"{marker} {insn.getAddress()} {insn}")
print("")