//---------------------------------------------------------------------- // вывод одного операнда bool idaapi mn102_outop(op_t &x) { switch ( x.type ){ // ссылка на память с использованием регистра (регистров) // (disp,Ri) case o_displ: // открывающая скобка есть всегда // регистр пристуствует? out_symbol('('); OutValue(x); out_symbol(','); out_register(ph.regNames[x.reg]); out_symbol(')'); break; // регистр case o_reg: if ( x.reg&0x80)out_symbol('(' ); if ( x.reg&0x10 ){ out_register(ph.regNames[((x.reg>>5)&3)+rD0]); out_symbol(','); } out_register(ph.regNames[x.reg&0x0F]); if ( x.reg&0x80)out_symbol(')' ); break; // непосредственные данные case o_imm: #if IDP_INTERFACE_VERSION > 37 refinfo_t ri; // micro bug-fix if ( get_refinfo(cmd.ea, x.n, &ri) ){ if ( ri.flags==REF_OFF16 ) set_refinfo(cmd.ea, x.n, REF_OFF32, ri.target, ri.base, ri.tdelta); } #endif OutValue(x, /*OOFS_NOSIGN | */ OOF_SIGNED | OOFW_IMM); break; // ссылка на программу case o_near: OutVarName(x); break; // прямая ссылка на память case o_mem: out_symbol('('); OutVarName(x); out_symbol(')'); break; // пустыка не выводится case o_void: return 0; // неизвестный операнд default: warning("out: %a: bad optype %d",cmd.ea,x.type); break; }
//---------------------------------------------------------------------- // вывод одного операнда bool idaapi C39_outop(op_t &x) { switch ( x.type ){ // только регистр case o_reg: out_register(ph.regNames[x.reg]); break; // непосредственные данные (8 бит) case o_imm: out_symbol('#'); #if IDP_INTERFACE_VERSION > 37 refinfo_t ri; // micro bug-fix if(get_refinfo(cmd.ea, x.n, &ri)){ if(ri.flags==REF_OFF16) set_refinfo(cmd.ea, x.n, REF_OFF32, ri.target, ri.base, ri.tdelta); msg("Exec OFF16_Op Fix AT:%a Flags=%lx, Target=%lx, Base=%lx, Delta=%lx\n", cmd.ea, ri.flags,ri.target,ri.base,ri.tdelta); } #endif OutValue(x, /*OOFS_NOSIGN | */ OOF_SIGNED | OOFW_IMM); break; // прямая ссылка на программу (реально - относительно PC) case o_near: OutVarName(x); break; // обращение к ячейке памяти case o_mem: if(x.specflag1&URR_IND) out_symbol('('); OutValue(x, OOFS_NOSIGN | OOFW_IMM); if(x.specflag1&URR_IND) out_symbol(')'); break; // пустыка не выводится case o_void: return 0; // неизвестный операнд default: warning("out: %lx: bad optype",cmd.ea,x.type); break; } return 1; }
//-------------------------------------------------------------------------- void idaapi C39_data(ea_t ea) { #if IDP_INTERFACE_VERSION > 37 refinfo_t ri; // micro bug-fix if(get_refinfo(ea, 0, &ri)){ if(ri.flags==REF_OFF16){ set_refinfo(ea, 0, REF_OFF32, ri.target, ri.base, ri.tdelta); msg("Exec OFF16 Fix AT:%a Flags=%lx, Target=%lx, Base=%lx, Delta=%lx\n",ea, ri.flags,ri.target,ri.base,ri.tdelta); } } #endif gl_name = 1; // попробуем вывести, как equ // if (out_equ(ea)) return; // не получилось - выводим данными intel_data(ea); }