1*9a0e4156SSadaf Ebrahimi#!/usr/bin/env python 2*9a0e4156SSadaf Ebrahimi 3*9a0e4156SSadaf Ebrahimi# Capstone Python bindings, by Sebastian Macke <Sebastian Macke> 4*9a0e4156SSadaf Ebrahimifrom __future__ import print_function 5*9a0e4156SSadaf Ebrahimifrom capstone import * 6*9a0e4156SSadaf Ebrahimifrom capstone.mos65xx import * 7*9a0e4156SSadaf Ebrahimifrom xprint import to_hex, to_x 8*9a0e4156SSadaf Ebrahimi 9*9a0e4156SSadaf EbrahimiMOS65XX_CODE = b"\x0d\x34\x12\x00\x81\x65\x6c\x01\x00\x85\xFF\x10\x00\x19\x42\x42\x00\x49\x42" 10*9a0e4156SSadaf Ebrahimi 11*9a0e4156SSadaf Ebrahimiaddress_modes=[ 12*9a0e4156SSadaf Ebrahimi 'No address mode', 13*9a0e4156SSadaf Ebrahimi 'implied addressing (no addressing mode)', 14*9a0e4156SSadaf Ebrahimi 'accumulator addressing', 15*9a0e4156SSadaf Ebrahimi 'absolute addressing', 16*9a0e4156SSadaf Ebrahimi 'zeropage addressing', 17*9a0e4156SSadaf Ebrahimi '8 Bit immediate value', 18*9a0e4156SSadaf Ebrahimi 'indexed absolute addressing by the X index register', 19*9a0e4156SSadaf Ebrahimi 'indexed absolute addressing by the Y index register', 20*9a0e4156SSadaf Ebrahimi 'indexed indirect addressing by the X index register', 21*9a0e4156SSadaf Ebrahimi 'indirect indexed addressing by the Y index register', 22*9a0e4156SSadaf Ebrahimi 'indexed zeropage addressing by the X index register', 23*9a0e4156SSadaf Ebrahimi 'indexed zeropage addressing by the Y index register', 24*9a0e4156SSadaf Ebrahimi 'relative addressing used by branches', 25*9a0e4156SSadaf Ebrahimi 'absolute indirect addressing' 26*9a0e4156SSadaf Ebrahimi]; 27*9a0e4156SSadaf Ebrahimi 28*9a0e4156SSadaf Ebrahimi 29*9a0e4156SSadaf Ebrahimidef print_insn_detail(insn): 30*9a0e4156SSadaf Ebrahimi # print address, mnemonic and operands 31*9a0e4156SSadaf Ebrahimi print("0x%x:\t%s\t%s" % (insn.address, insn.mnemonic, insn.op_str)) 32*9a0e4156SSadaf Ebrahimi 33*9a0e4156SSadaf Ebrahimi # "data" instruction generated by SKIPDATA option has no detail 34*9a0e4156SSadaf Ebrahimi if insn.id == 0: 35*9a0e4156SSadaf Ebrahimi return 36*9a0e4156SSadaf Ebrahimi print("\taddress mode: %s" % (address_modes[insn.am])) 37*9a0e4156SSadaf Ebrahimi print("\tmodifies flags: %s" % ('true' if insn.modifies_flags != 0 else 'false')) 38*9a0e4156SSadaf Ebrahimi if len(insn.operands) > 0: 39*9a0e4156SSadaf Ebrahimi print("\top_count: %u" % len(insn.operands)) 40*9a0e4156SSadaf Ebrahimi c = -1 41*9a0e4156SSadaf Ebrahimi for i in insn.operands: 42*9a0e4156SSadaf Ebrahimi c += 1 43*9a0e4156SSadaf Ebrahimi if i.type == MOS65XX_OP_REG: 44*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: REG = %s" % (c, insn.reg_name(i.reg))) 45*9a0e4156SSadaf Ebrahimi if i.type == MOS65XX_OP_IMM: 46*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: IMM = 0x%s" % (c, to_x(i.imm))) 47*9a0e4156SSadaf Ebrahimi if i.type == MOS65XX_OP_MEM: 48*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: MEM = 0x%s" % (c, to_x(i.mem))) 49*9a0e4156SSadaf Ebrahimi 50*9a0e4156SSadaf Ebrahimi 51*9a0e4156SSadaf Ebrahimi# ## Test class Cs 52*9a0e4156SSadaf Ebrahimidef test_class(): 53*9a0e4156SSadaf Ebrahimi print("*" * 16) 54*9a0e4156SSadaf Ebrahimi print("Platform: %s" % "MOS65XX") 55*9a0e4156SSadaf Ebrahimi print("Code: %s" % to_hex(MOS65XX_CODE)) 56*9a0e4156SSadaf Ebrahimi print("Disasm:") 57*9a0e4156SSadaf Ebrahimi 58*9a0e4156SSadaf Ebrahimi try: 59*9a0e4156SSadaf Ebrahimi md = Cs(CS_ARCH_MOS65XX, 0) 60*9a0e4156SSadaf Ebrahimi md.detail = True 61*9a0e4156SSadaf Ebrahimi for insn in md.disasm(MOS65XX_CODE, 0x1000): 62*9a0e4156SSadaf Ebrahimi print_insn_detail(insn) 63*9a0e4156SSadaf Ebrahimi print() 64*9a0e4156SSadaf Ebrahimi 65*9a0e4156SSadaf Ebrahimi print("0x%x:\n" % (insn.address + insn.size)) 66*9a0e4156SSadaf Ebrahimi except CsError as e: 67*9a0e4156SSadaf Ebrahimi print("ERROR: %s" % e) 68*9a0e4156SSadaf Ebrahimi 69*9a0e4156SSadaf Ebrahimi 70*9a0e4156SSadaf Ebrahimiif __name__ == '__main__': 71*9a0e4156SSadaf Ebrahimi test_class() 72