5

私は今しばらくデバッグREP STOS DWORD PTR ES:[EDI]しています

私の結論から、それは常に使用します

ECXカウンターとして。 コピーされてから何度も追加EAXされる値として、ポイントされたダンプを入れた後EDIECXEDI

EDIを4バイト変更しながら、常にECXのみをカウンターとして使用しているように見えるもので、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--) { }のアクションであることに注意してください。REPSTOS DWORD...

このような質問が多いので、Intel 64 and IA-32 Architectures Software Developer's Manual, Volumes 2A and 2Bが役に立つと思います。これらには、擬似コードの説明を含む、各命令とプレフィックスの説明が含まれています。

于 2011-10-14T06:47:50.053 に答える