我正在拆解一个旧的(1996 年)游戏,它是用 Watcom 386 编译器编译的。这个编译器似乎积极地重新排序指令以更好地利用处理器管道,如以下汇编块所示:
标有红点的指令设置下一次调用的参数;带有蓝点的指令完成了上次调用返回的对象的初始化。重新排列它们使程序集更易于阅读:
...
call ClassAlloc13680_0FAh
mov edx, [eax]
mov [edx+Class180F4.WidgetInputHandler], offset gblHandleTransportDestinationAndCheckForPassengersSpace
mov edx, [eax]
mov [edx+Class13680.Paint???], offset ClassVehicleManager__PaintForSomeWidget
mov dword_A4D88, eax
mov eax, [eax]
mov [eax+Class10B8C.MouseInputHandler], offset ClassVehicleManager__MouseInputHandler
push 0
push 2
push 0
push 4Eh
push 5Bh
mov ebx, 5Ch
mov ecx, 21h
mov edx, ebp
mov eax, ebp
call ClassAlloc13680_0FAh
push 0
push 2
...
(请注意,我将mov reg, xxh
指令进一步向下移动,因为编译器的调用约定是 ax-dx-cx-bx-stack,所以我也可以在这里看到参数的顺序)
有没有办法在 IDA 中实现这一点?我不是在要求一种算法来自动确定哪些指令应该是“红色”,哪些应该是“蓝色”,而且我不想修补原始二进制文件,我只想手动重新排列指令在 ida 数据库中。
或者有没有其他方法可以提高 IDA 中此类代码的可读性?