1 // Capstone Java binding 2 // By Nguyen Anh Quynh & Dang Hoang Vu, 2013-2014 3 4 import capstone.Capstone; 5 import capstone.Xcore; 6 7 import static capstone.Xcore_const.*; 8 9 public class TestXcore { hexString2Byte(String s)10 static byte[] hexString2Byte(String s) { 11 // from http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a-hex-dump-to-a-byte-array-using-java 12 int len = s.length(); 13 byte[] data = new byte[len / 2]; 14 for (int i = 0; i < len; i += 2) { 15 data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 16 + Character.digit(s.charAt(i+1), 16)); 17 } 18 return data; 19 } 20 21 static final String XCORE_CODE = "fe0ffe171317c6feec1797f8ec4f1ffdec3707f2455bf9fa02061b1009fdeca7"; 22 23 public static Capstone cs; 24 hex(int i)25 private static String hex(int i) { 26 return Integer.toString(i, 16); 27 } 28 hex(long i)29 private static String hex(long i) { 30 return Long.toString(i, 16); 31 } 32 print_ins_detail(Capstone.CsInsn ins)33 public static void print_ins_detail(Capstone.CsInsn ins) { 34 System.out.printf("0x%x:\t%s\t%s\n", ins.address, ins.mnemonic, ins.opStr); 35 36 Xcore.OpInfo operands = (Xcore.OpInfo) ins.operands; 37 38 if (operands.op.length != 0) { 39 System.out.printf("\top_count: %d\n", operands.op.length); 40 for (int c=0; c<operands.op.length; c++) { 41 Xcore.Operand i = (Xcore.Operand) operands.op[c]; 42 if (i.type == XCORE_OP_REG) 43 System.out.printf("\t\toperands[%d].type: REG = %s\n", c, ins.regName(i.value.reg)); 44 if (i.type == XCORE_OP_IMM) 45 System.out.printf("\t\toperands[%d].type: IMM = 0x%x\n", c, i.value.imm); 46 if (i.type == XCORE_OP_MEM) { 47 System.out.printf("\t\toperands[%d].type: MEM\n", c); 48 if (i.value.mem.base != XCORE_REG_INVALID) 49 System.out.printf("\t\t\toperands[%d].mem.base: REG = %s\n", c, ins.regName(i.value.mem.base)); 50 if (i.value.mem.index != XCORE_REG_INVALID) 51 System.out.printf("\t\t\toperands[%d].mem.index: REG = %s\n", c, ins.regName(i.value.mem.index)); 52 if (i.value.mem.disp != 0) 53 System.out.printf("\t\t\toperands[%d].mem.disp: 0x%x\n", c, i.value.mem.disp); 54 if (i.value.mem.direct != 1) 55 System.out.printf("\t\t\toperands[%d].mem.direct: -1\n", c); 56 } 57 } 58 } 59 } 60 main(String argv[])61 public static void main(String argv[]) { 62 63 final Test.platform[] all_tests = { 64 new Test.platform(Capstone.CS_ARCH_XCORE, Capstone.CS_MODE_BIG_ENDIAN, hexString2Byte(XCORE_CODE), "XCore"), 65 }; 66 67 for (int i=0; i<all_tests.length; i++) { 68 Test.platform test = all_tests[i]; 69 System.out.println(new String(new char[16]).replace("\0", "*")); 70 System.out.println("Platform: " + test.comment); 71 System.out.println("Code: " + Test.stringToHex(test.code)); 72 System.out.println("Disasm:"); 73 74 cs = new Capstone(test.arch, test.mode); 75 cs.setDetail(Capstone.CS_OPT_ON); 76 Capstone.CsInsn[] all_ins = cs.disasm(test.code, 0x1000); 77 78 for (int j = 0; j < all_ins.length; j++) { 79 print_ins_detail(all_ins[j]); 80 System.out.println(); 81 } 82 System.out.printf("0x%x:\n\n", (all_ins[all_ins.length-1].address + all_ins[all_ins.length-1].size)); 83 84 // Close when done 85 cs.close(); 86 } 87 } 88 89 } 90