在OllyDbg中,寄存器窗口列出了标准的cpu寄存器:
EAX
ECX
EDX
EBX
为什么EBX最后显示有特殊原因?
答案 0 :(得分:7)
这可能与它们在处理器指令中以这种方式排序的原因相同。当指定32位寄存器时,eax为0,ecx为1,edx为2,ebx为3,esp为4,ebp为5,esi为6,edi为7.英特尔自启动X86后使用此命令架构。
答案 1 :(得分:2)
我的猜测是因为EAX,ECX和EDX被cdecl,stdcall和其他calling conventions中的函数用作临时寄存器,即它们在函数调用后不会被保留。除了剩余的寄存器之外,特殊用途是指针Intel Developer Manual (2.36MB PDF)中记录的指针。那只是我的两分钱。
答案 2 :(得分:1)
由于我多年来一直使用ollydbg进行逆向工程,我可以告诉你,调试时这是重要的顺序。 Eax因其性质而无处不在。它获得了返回值,它被大量使用。然后,我会说ecx和edx是相同的。循环,repsb等指令使用ecx,而div,muls等使用edx。而且,当我们在汇编中编程时,我们倾向于使用eax,edx和ecx。有时使用Esi和edi,主要是在重复字符串函数中或在某些情况下作为辅助寄存器。
我认为订单背后的原因实际上是英特尔使用订单的方式,但是在我的ollydebug寄存器上安装esi会非常奇怪,因为eax到处使用。因此,它也具有人体工程学点:D
答案 3 :(得分:0)
PUSHAD
是让我对这个问题有更多见解的指示。它将EAX,ECX,EDX,EBX,原始ESP,EBP,ESI和EDI的值推送到堆栈。这很可能是OllyDbg在寄存器视图中按顺序对它们进行排序的原因。可以找到PUSHAD
的说明here。