[英]Assembly How to convert REP STOS to C code
我一直在調試REP STOS DWORD PTR ES:[EDI]
一段時間了
從我的結論它總是使用
ECX
作為反擊。 EAX
作為將通過EDI
復制的值,然后在放入EDI
的指向轉儲后附加ECX
時間
它似乎在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個字節永遠不會更少?
你幾乎是對的。 唯一的區別是方向標志( 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...
的動作。
由於您提出了很多這些問題,我認為您會發現英特爾64和IA-32架構軟件開發人員手冊,第2A和2B卷是有用的。 它們包含每條指令和前綴的描述,包括偽代碼描述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.