size_t DisCliValueString( void *d, dis_dec_ins *ins, unsigned op, char *buff, size_t buff_size ) { mad_disasm_data *dd = d; mad_type_info mti; address val; buff[0] = '\0'; val = dd->addr; switch( ins->op[op].type & DO_MASK ) { case DO_RELATIVE: val.mach.offset += ins->op[op].value; //NYI: 64 bit MCAddrToString( val, MIPST_N32_PTR, MLK_CODE, buff, buff_size ); break; case DO_ABSOLUTE: if( dd->ins.type == DI_MIPS_J || dd->ins.type == DI_MIPS_JAL ) { // Handle j/jal as having pointer operand to show target symbol val.mach.offset = ins->op[op].value; MCAddrToString( val, MIPST_N32_PTR, MLK_CODE, buff, buff_size ); break; } // Fall through case DO_IMMED: case DO_MEMORY_ABS: MCTypeInfoForHost( MTK_INTEGER, SIGNTYPE_SIZE( sizeof( ins->op[0].value ) ), &mti ); MCTypeToString( dd->radix, &mti, &ins->op[op].value, buff, &buff_size ); break; } return( strlen( buff ) ); }
size_t DisCliValueString( void *d, dis_dec_ins *ins, unsigned op, char *buff ) { mad_disasm_data *dd = d; char *p; unsigned max; mad_type_info mti; address val; p = buff; p[0] = '\0'; val = dd->addr; switch( ins->op[op].type & DO_MASK ) { case DO_RELATIVE: val.mach.offset += ins->op[op].value; //NYI: 64 bit MCAddrToString( val, AXPT_N32_PTR, MLK_CODE, 40, p ); break; case DO_IMMED: case DO_ABSOLUTE: case DO_MEMORY_ABS: MCTypeInfoForHost( MTK_INTEGER, -(int)sizeof( ins->op[0].value ), &mti ); max = 40; MCTypeToString( dd->radix, &mti, &ins->op[op].value, &max, p ); break; } return( strlen( buff ) ); }
char *ToSegStr( addr_off value, addr_seg seg, addr_off addr ) { address memaddr; mad_type_handle th; addr = addr; memaddr.mach.segment = seg; memaddr.mach.offset = value; MCAddrSection( &memaddr ); th = BIG_SEG( memaddr ) ? X86T_F32_PTR : X86T_F16_PTR; MCAddrToString( memaddr, th, MLK_MEMORY, sizeof( ScratchBuff ) - 1, ScratchBuff ); return( ScratchBuff ); }
char *JmpLabel( unsigned long addr, addr_off off ) { address memaddr; mad_type_handle th; char *p; off = off; memaddr = DbgAddr; memaddr.mach.offset = addr; th = ( BIG_SEG( memaddr ) ) ? X86T_N32_PTR : X86T_N16_PTR; #define PREFIX_STR "CS:" #define PREFIX_LEN (sizeof(PREFIX_STR)-1) p = &ScratchBuff[ PREFIX_LEN ]; if( MCAddrToString( memaddr, th, MLK_CODE, sizeof( ScratchBuff ) - 1 - PREFIX_LEN, p ) != MS_OK ) { p -= PREFIX_LEN; memcpy( p, PREFIX_STR, PREFIX_LEN ); } return( p ); }
size_t DisCliValueString( void *d, dis_dec_ins *ins, unsigned op, char *buff, size_t buff_size ) { mad_disasm_data *dd = d; mad_type_info mti; address val; buff[0] = '\0'; val = dd->addr; switch( ins->op[op].type & DO_MASK ) { case DO_RELATIVE: val.mach.offset += ins->op[op].value; //NYI: 64 bit MCAddrToString( val, PPCT_N32_PTR, MLK_CODE, buff, buff_size ); break; case DO_IMMED: case DO_ABSOLUTE: case DO_MEMORY_ABS: MCTypeInfoForHost( MTK_INTEGER, SIGNTYPE_SIZE( sizeof( ins->op[0].value ) ), &mti ); MCTypeToString( dd->radix, &mti, &ins->op[op].value, buff, &buff_size ); break; } return( strlen( buff ) ); }
size_t DisCliValueString( void *d, dis_dec_ins *ins, unsigned opnd, char *buff ) { mad_disasm_data *dd = d; char *p; unsigned max = 40; mad_type_info mti; address val; dis_operand *op; int size; op = &ins->op[opnd]; p = buff; p[0] = '\0'; val = dd->addr; switch( op->type & DO_MASK ) { case DO_IMMED: switch( op->ref_type ) { case DRT_X86_BYTE: size = 1; break; case DRT_X86_WORD: size = 2; break; case DRT_X86_DWORD: case DRT_X86_DWORDF: size = 4; break; default: size = (ins->flags.u.x86 & DIF_X86_OPND_LONG) ? 4 : 2; } MCTypeInfoForHost( MTK_INTEGER, size , &mti ); MCTypeToString( dd->radix, &mti, &op->value, &max, p ); break; case DO_RELATIVE: val.mach.offset += op->value; MCAddrToString( val, (ins->flags.u.x86 & DIF_X86_OPND_LONG) ? X86T_N32_PTR : X86T_N16_PTR , MLK_CODE, max, p ); break; case DO_ABSOLUTE: if( op->type & DO_EXTRA ) { val.mach.offset = op->value; val.mach.segment = op->extra; MCAddrToString( val, (ins->flags.u.x86 & DIF_X86_OPND_LONG) ? X86T_F32_PTR : X86T_F16_PTR , MLK_CODE, max, p ); break; } /* fall through for LEA instruction */ case DO_MEMORY_ABS: case DO_MEMORY_REL: if( op->base == DR_NONE && op->index == DR_NONE ) { // direct memory address MCTypeInfoForHost( MTK_INTEGER, (ins->flags.u.x86 & DIF_X86_ADDR_LONG) ? 4 : 2 , &mti ); MCTypeToString( dd->radix, &mti, &op->value, &max, p ); } else if( op->value == 0 ) { // don't output zero disp in indirect memory address } else { // indirect memory address with displacement if( op->value < 0 ) { *(p++) = '-'; op->value = - op->value; } size = GetValueByteSize( op->value ); MCTypeInfoForHost( MTK_INTEGER, size , &mti ); MCTypeToString( dd->radix, &mti, &op->value, &max, p ); } break; } return( strlen( buff ) ); }