Что делает последовательность операций сборки x86 rep stos? - PullRequest
37 голосов
/ 29 сентября 2010

Я недавно наткнулся на следующую последовательность инструкций по сборке:

rep stos    dword ptr [edi]

Ответы [ 2 ]

59 голосов
/ 29 сентября 2010

Для ecx повторений сохраняет содержимое eax в том месте, куда edi указывает, увеличивая или уменьшая edi (в зависимости от флага направления) на 4 байта каждый раз. Обычно это используется для операции типа memset.

Обычно эта инструкция просто пишется rep stosd. Опытные сборщики кодов знают все детали, упомянутые выше, просто увидев это. : -)


ETA за полноту (спасибо PhiS): каждая итерация, ecx уменьшается на 1, и цикл останавливается, когда достигает нуля. Для stos единственное, что вы заметите, это то, что ecx очищается в конце. Но для scas и т.п., где используются префиксы repz / repnz, ecx может быть больше нуля, если операция остановлена ​​до исчерпания ecx байтов / слов / whatevers.

Прежде чем вы спросите, scas используется для реализации операций strchr -типа. : -Р

0 голосов
/ 03 июля 2019
Empty array: 
char buff[256] = { }; 

 776      1c5:   48 8d 95 e0 fc ff ff    lea    -0x320(%rbp),%rdx
 777      1cc:   b8 00 00 00 00          mov    $0x0,%eax
 778      1d1:   b9 20 00 00 00          mov    $0x20,%ecx
 779      1d6:   48 89 d7                mov    %rdx,%rdi
 780      1d9:   f3 48 ab                **rep stos %rax,%es:(%rdi)**
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...