Implemented better output for indirect calls.

oldstable
Juergen Schmied 1999-02-14 13:30:18 +00:00 committed by Alexandre Julliard
parent b8f6ea52ce
commit 36358806ab
1 changed files with 23 additions and 8 deletions

View File

@ -1011,10 +1011,11 @@ static void db_task_printsym(unsigned int addr, int size)
}
void
db_print_address(seg, size, addrp)
db_print_address(seg, size, addrp, byref)
char * seg;
int size;
struct i_addr *addrp;
int byref;
{
if (addrp->is_reg) {
fprintf(stderr,"%s", db_reg[size][addrp->disp]);
@ -1033,8 +1034,22 @@ db_print_address(seg, size, addrp)
if (addrp->index)
fprintf(stderr,",%s,%d", addrp->index, 1<<addrp->ss);
fprintf(stderr,")");
} else
db_task_printsym(addrp->disp, size);
}
else {
/* try to get destination of indirect call)
works not for segmented adresses */
if (!seg && byref) {
DBG_ADDR dbg_addr = {0,0,*(LPDWORD)(addrp->disp)};
fprintf(stderr,"0x%x -> ", addrp->disp);
if ( DEBUG_IsBadReadPtr( &dbg_addr, sizeof(DWORD)))
fprintf(stderr, "(invalid destination)");
else
db_task_printsym(dbg_addr.off, 0);
}
else
db_task_printsym(addrp->disp, size);
}
}
/*
@ -1087,7 +1102,7 @@ void db_disasm_esc( DBG_ADDR *addr, int inst, int short_addr,
break;
}
fprintf(stderr,"\t");
db_print_address(seg, BYTE, &address);
db_print_address(seg, BYTE, &address, 0);
}
else {
/*
@ -1328,7 +1343,7 @@ void DEBUG_Disasm( DBG_ADDR *addr, int display )
case E:
if( db_display )
{
db_print_address(seg, size, &address);
db_print_address(seg, size, &address, 0);
}
break;
@ -1336,21 +1351,21 @@ void DEBUG_Disasm( DBG_ADDR *addr, int display )
if( db_display )
{
fprintf(stderr,"*");
db_print_address(seg, size, &address);
db_print_address(seg, size, &address, 1);
}
break;
case Ew:
if( db_display )
{
db_print_address(seg, WORD, &address);
db_print_address(seg, WORD, &address, 0);
}
break;
case Eb:
if( db_display )
{
db_print_address(seg, BYTE, &address);
db_print_address(seg, BYTE, &address, 0);
}
break;