size_t DisCliValueString( void *d, dis_dec_ins *ins, unsigned op_num, char *buff, size_t buff_len ) { struct pass2 *pd = d; size_t len; dis_operand *op; ref_flags rf; buff_len = buff_len; buff[0] = '\0'; rf = RFLAG_DEFAULT; op = &ins->op[op_num]; switch( op->type & DO_MASK ) { case DO_RELATIVE: case DO_MEMORY_REL: case DO_ABSOLUTE: case DO_MEMORY_ABS: if( pd->r_entry != NULL ) { /* if there is an override we must avoid the frame */ if( ( ins->flags.u.x86 & DIS_X86_SEG_OR ) && IsIntelx86() ) { rf |= RFLAG_NO_FRAME; } len = HandleAReference( op->value, ins->size, rf, pd->loop + op->op_position, pd->size, &pd->r_entry, buff ); if( len != 0 ) { return( len ); } } switch( op->type & DO_MASK ) { case DO_RELATIVE: case DO_MEMORY_REL: op->value += pd->loop; break; } if( op->base == DR_NONE && op->index == DR_NONE ) { FmtSizedHexNum( buff, ins, op_num ); } else if( op->value > 0 ) { FmtHexNum( buff, 0, op->value, FALSE ); } else if( op->value < 0 ) { buff[0] = '-'; FmtHexNum( &buff[1], 0, -op->value, FALSE ); } break; case DO_IMMED: if( pd->r_entry != NULL ) { rf |= RFLAG_IS_IMMED; len = HandleAReference( op->value, ins->size, rf, pd->loop + op->op_position, pd->size, &pd->r_entry, buff ); if( len != 0 ) { return( len ); } } FmtSizedHexNum( buff, ins, op_num ); break; } return( strlen( buff ) ); }
extern unsigned DisCliValueString( void *d, dis_dec_ins *ins, unsigned op_num, char *buff ) { dis_operand *op; code_buff *header; header = (code_buff *)d; buff[0] = '\0'; op = &ins->op[op_num]; switch( op->type & DO_MASK ) { case DO_RELATIVE: case DO_MEMORY_REL: case DO_ABSOLUTE: case DO_MEMORY_ABS: switch( op->type & DO_MASK ) { case DO_RELATIVE: case DO_MEMORY_REL: op->value += header->offset; break; } if( op->base == DR_NONE && op->index == DR_NONE ) { FmtSizedHexNum( buff, ins, op_num ); } else if( op->value > 0 ) { FmtHexNum( buff, 0, op->value ); } else if( op->value < 0 ) { buff[0] = '-'; FmtHexNum( &buff[1], 0, -op->value ); } break; case DO_IMMED: // FmtSizedHexNum( buff, ins, op_num ); if( op->value < 0 ) { buff[0] = '-'; FmtHexNum( &buff[1], 0, -op->value ); } else { FmtHexNum( buff, 0, op->value ); } break; } return( strlen( buff ) ); }