1 /* Capstone Disassembler Engine */ 2 /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014 */ 3 4 #include <stdio.h> 5 6 #include <capstone.h> 7 8 void print_string_hex(char *comment, unsigned char *str, size_t len); 9 10 void print_insn_detail_sparc(csh handle, cs_insn *ins) 11 { 12 cs_sparc *sparc; 13 int i; 14 15 // detail can be NULL on "data" instruction if SKIPDATA option is turned ON 16 if (ins->detail == NULL) 17 return; 18 19 sparc = &(ins->detail->sparc); 20 if (sparc->op_count) 21 printf("\top_count: %u\n", sparc->op_count); 22 23 for (i = 0; i < sparc->op_count; i++) { 24 cs_sparc_op *op = &(sparc->operands[i]); 25 switch((int)op->type) { 26 default: 27 break; 28 case SPARC_OP_REG: 29 printf("\t\toperands[%u].type: REG = %s\n", i, cs_reg_name(handle, op->reg)); 30 break; 31 case SPARC_OP_IMM: 32 printf("\t\toperands[%u].type: IMM = 0x%x\n", i, op->imm); 33 break; 34 case SPARC_OP_MEM: 35 printf("\t\toperands[%u].type: MEM\n", i); 36 if (op->mem.base != X86_REG_INVALID) 37 printf("\t\t\toperands[%u].mem.base: REG = %s\n", 38 i, cs_reg_name(handle, op->mem.base)); 39 if (op->mem.index != X86_REG_INVALID) 40 printf("\t\t\toperands[%u].mem.index: REG = %s\n", 41 i, cs_reg_name(handle, op->mem.index)); 42 if (op->mem.disp != 0) 43 printf("\t\t\toperands[%u].mem.disp: 0x%x\n", i, op->mem.disp); 44 45 break; 46 } 47 } 48 49 if (sparc->cc != 0) 50 printf("\tCode condition: %u\n", sparc->cc); 51 52 if (sparc->hint != 0) 53 printf("\tHint code: %u\n", sparc->hint); 54 } 55