簡體   English   中英

匯編如何將REP STOS轉換為C代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM