Сборка Как конвертировать REP STOS в C код - PullRequest
4 голосов
/ 14 октября 2011

Я уже некоторое время отлаживаю REP STOS DWORD PTR ES:[EDI]

Исходя из моего заключения, он всегда использует

ECX в качестве счетчика. EAX как значение, которое будет скопировано за EDI, а затем добавлено ECX раз поэтому после помещения в заостренный отвал 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 Ответ

9 голосов
/ 14 октября 2011

Вы почти правы.Единственное отличие состоит в том, что флаг направления (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--) { } - это действие префикса REP, а тело цикла - это действие STOS DWORD....

, поскольку вы спрашиваете многоиз этих вопросов, я думаю, вы найдете полезными Руководство разработчика программного обеспечения Intel 101 и Intel-32 *, тома 2A и 2B .Они содержат описания каждой инструкции и префикса, включая описания псевдокода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...