Jeff L wrote:
This patch came about when I was looking at why single stepping seemed to stuff up after a call. It breaks down the calls for 32 bit mode calls but not necessarily 16 and not 64 bit calls. It is a fairly messy area of knowledge and I could do with assistance as to how the 16/32/64 bit modes work.
Change log: Add code to analyse far calls in be_i386_is_func_call instead of only near calls.
Jeff Latimer
switch (rm)
{
case 0x00:
segment = dbg_context.Eax;
break;
case 0x01:
segment = dbg_context.Ecx;
break;
case 0x02:
segment = dbg_context.Edx;
break;
case 0x03:
segment = dbg_context.Ebx;
break;
case 0x04:
break;
case 0x05:
segment = dbg_context.Ebp;
break;
case 0x06:
segment = dbg_context.Esi;
break;
case 0x07:
segment = dbg_context.Edi;
break;
}
this is wrong... this is part of the offset computation, not the segment (as it's an intra-segment call)
callee->Mode = AddrModeFlat;
callee->Segment = segment;
callee->Offset = delta; /* absolute address not an offset */
here you should use a callee->Mode of AddrMode1632 or AddrMode1616, not a flat one
basically, you can tell if it's a 16 or 32 bit call depending whether the current cs refers to a 16 or 32 bit selector
A+