在 OllyDbg 中,寄存器窗口中列出了标准的 cpu 寄存器:
EAX
ECX
EDX
EBX
最后显示EBX有什么特别的原因吗?
在 OllyDbg 中,寄存器窗口中列出了标准的 cpu 寄存器:
EAX
ECX
EDX
EBX
最后显示EBX有什么特别的原因吗?
这可能与它们在处理器指令中以这种方式排序的原因相同。指定32位寄存器时,eax为0,ecx为1,edx为2,ebx为3,esp为4,ebp为5,esi为6,edi为7。Intel从X86开始就使用这个顺序建筑学。
我的猜测是,这是因为 EAX、ECX 和 EDX 被 cdecl、stdcall 和其他调用约定中的函数用作临时寄存器,也就是说,它们在函数调用后没有保留。除了剩余的寄存器之外,特殊用途是作为英特尔开发人员手册 (2.36MB PDF)中记录的指针。那只是我的两分钱。
由于我多年来一直使用 ollydbg 进行逆向工程,我可以告诉你,这是调试时的重要性顺序。由于其性质,Eax 无处不在。它获取返回值,它被使用了很多。然后,我会说 ecx 和 edx 的发生率相同。loop、repsb 等指令使用 ecx,而 div、muls 等使用 edx。此外,当我们在汇编中编程时,我们倾向于大量使用 eax、edx 和 ecx。有时也会使用 Esi 和 edi,主要用于重复字符串函数或在某些情况下用作辅助寄存器。
我想订单背后的原因实际上是英特尔使用订单的方式,但是将 esi 放在我的 ollydebug 寄存器之上真的很奇怪,因为 eax 到处都在使用。因此,它也具有人体工程学点:D
PUSHAD
是让我对这个问题有更多洞察力的指令。它将 EAX、ECX、EDX、EBX、原始 ESP、EBP、ESI 和 EDI 的值推送到堆栈。这很可能是 OllyDbg 在寄存器视图中按该顺序对它们进行排序的原因。的描述PUSHAD
可以在这里找到。