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 ) ); }
mad_status MADIMPENTRY( TypeToString )( mad_radix radix, const mad_type_info *mti, const void *data, char *buff, size_t *buff_size_p ) { mad_status ms; const mad_type_info *new_mti; unsigned_16 temp[4]; switch( mti->b.handler_code ) { case AXPT_F_FLOAT: new_mti = TypeArray[AXPT_FLOAT].u.mti; break; case AXPT_G_FLOAT: case AXPT_D_FLOAT: new_mti = TypeArray[AXPT_DOUBLE].u.mti; break; default: return( MS_UNSUPPORTED ); } ms = DoConvert( mti, data, new_mti, &temp ); if( ms != MS_OK ) return( ms ); return( MCTypeToString( radix, new_mti, temp, buff, buff_size_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 ) ); }