Пример #1
0
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 ) );
}
Пример #2
0
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 ) );
}
Пример #3
0
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 ) );
}
Пример #4
0
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 ) );
}
Пример #5
0
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 ) );
}