Меня немного смущает комментарий в одном из файлов заголовков для ядра Linux, arch / x86 / include / asm / nops.h .В нем говорится, что
<...> следующие инструкции НЕ являются nops в 64-битном режиме, для 64-битного режима вместо этого используйте K8 или P6 nops
movl% esi,% esi
leal 0x00 (% esi),% esi
<...>
Полагаю, автор подразумевал машинные инструкции ('89 F6 'и' 8D 76 00 'соответственно)там, а не инструкции по сборке.Из описания LEA
в Руководстве разработчика программного обеспечения Intel, том 2А, последняя инструкция (lea 0x00(%rsi), %esi
) делает то же самое, что и первая, mov %esi,%esi
.
Так что это сводится к вопросу,* действительно ли mov %esi,%esi
не используется в x86-64.
mov
не изменяет флаги.Этот тип mov
также не меняет память.Кажется, если что-то изменится, кроме %rip
, это должны быть регистры общего назначения.Но я понятия не имею, как он может изменить содержимое %rsi
или что-то еще.Если вы манипулируете нижней половиной регистра общего назначения, верхняя половина не должна меняться, верно?