汇编如何将REP STOS转换为C代码

时间:2011-10-14 05:52:01

标签: c assembly x86 machine-code code-translation

我一直在调试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个字节永远不会更少?

1 个答案:

答案 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很有用。它们包含每条指令和前缀的描述,包括伪代码描述。