5

我调试REP STOS DWORD PTR ES:[EDI]了一段时间

根据我的结论,它总是使用

ECX作为计数器。 EAX作为将被复制EDI然后附加ECX时间的值,因此在放入指向的转储之后EDI

它似乎用它似乎总是只使用 ECX 作为计数器,同时将 EDI 更改了 4 个字节来覆盖 EDI 中的指向数据。当计数器达到 0 时它停止工作

所以我想出了这种代码

while(regs.d.ecx != 0)
{
    *(unsigned int *)(regs.d.edi) = regs.d.eax;
    regs.d.edi += 4;
    regs.d.ecx--;
}

似乎工作..但我很担心,因为我只是靠运气和猜测工作做到了这一点。坚固吗?就像它总是ECX像计数器一样,EAX像数据一样,它总是复制 4 个字节,永远不会少?

4

1 回答 1

10

你几乎是正确的。唯一的区别是方向标志 ( DF) 控制是否添加或减去 4 EDI(它实际上是从ES段基偏移,但您可能不关心这一点):

for (; regs.d.ecx != 0; regs.d.ecx--)
{
    *(unsigned int *)(regs.d.edi) = regs.d.eax;
    regs.d.edi += regs.eflags.df ? -4 : 4;
}

注意for (; regs.d.ecx != 0; regs.d.ecx--) { }REP前缀的动作,循环体是 的动作STOS DWORD...

由于您提出了很多这样的问题,我认为您会发现Intel 64 和 IA-32 架构软件开发人员手册第 2A 卷和第 2B 卷很有用。这些包含每条指令和前缀的描述,包括伪代码描述。

于 2011-10-14T06:47:50.053 回答