我一直在调试REP STOS DWORD PTR ES:[EDI]
从我的结论来看,它始终使用
ECX
作为反击。
EAX
作为将在EDI
上复制然后追加ECX
次的值
在放入EDI
它似乎用EDI覆盖EDI上的指向数据 它似乎总是只使用ECX作为计数器,同时将EDI改变4个字节。 当计数器命中0时停止工作
所以我提出了这种代码
while(regs.d.ecx != 0)
{
*(unsigned int *)(regs.d.edi) = regs.d.eax;
regs.d.edi += 4;
regs.d.ecx--;
}
似乎工作..但我担心,因为我只是运气和猜测工作。它结实吗?喜欢它总是ECX
作为计数器,EAX
作为数据,它总是复制4个字节永远不会更少?
答案 0 :(得分:9)
你几乎是对的。唯一的区别是方向标记(DF
)控制是否从EDI
添加或减去4(它实际上是从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 and IA-32 Architectures Software Developer’s Manual, Volumes 2A and 2B很有用。它们包含每条指令和前缀的描述,包括伪代码描述。