if (cmd.Operands[o].type == o_mem) {
tmp_ea = cmd.Operands[o].addr;
flags_t tmp_ea_flags = get_flags_novalue(tmp_ea);
- if (!isUnknown(tmp_ea_flags)) {
+ // ..but base float is ok..
+ int is_flt = isDwrd(tmp_ea_flags) || isFloat(tmp_ea_flags);
+ if (!is_flt && !isUnknown(tmp_ea_flags))
+ {
buf[0] = 0;
get_name(ea, tmp_ea, buf, sizeof(buf));
msg("%x: undefining %x '%s'\n", ea, tmp_ea, buf);
for (;;)
{
int drop_large = 0, do_rva = 0, set_scale = 0, jmp_near = 0;
- int word_imm = 0, dword_imm = 0, do_pushf = 0;
+ int word_imm = 0, dword_imm = 0, do_pushf = 0, do_nops = 0;
if ((ea >> 14) != ui_ea_block) {
ui_ea_block = ea >> 14;
if (get_word(ea + opr.offb) == (ushort)opr.value)
word_imm = 1;
}
+ else if (opr.type == o_displ && opr.addr == 0
+ && opr.offb != 0 && opr.hasSIB && opr.sib == 0x24)
+ {
+ // uses [esp+0] with 0 encoded into op
+ do_nops++;
+ }
}
}
else { // not code
qfprintf(fout, "%s\n", buf);
}
+ while (do_nops-- > 0)
+ qfprintf(fout, " nop ; adj\n");
+
// note: next_head skips some undefined stuff
ea = next_not_tail(ea); // correct?
if (ea == BADADDR)