Что означает" rep; nop; " в сборке x86? Это то же самое, что и инструкция" пауза"?
- что значит
rep; nopв смысле? - это то же самое как
pauseинструкция? - это то же самое как
rep nop(без запятой)? - в чем разница с простым
nopинструкция? - он ведет себя по-разному на процессорах AMD и Intel?
- (бонус) где находится официальная документация по этим инструкциям?
мотивация для этого вопрос
после некоторого обсуждения в комментариях другого вопроса я понял, что не знаю, что rep; nop; означает в x86 (или x86-64) сборке. А также я не мог найти хорошее объяснение в интернете.
я знаю, что rep - это префикс, который означает "повторить следующую инструкцию cx раз" (или, по крайней мере, это было, в старой 16-битной x86 сборке). Согласно этому сводная таблица в Википедии, вроде rep может использоваться только с movs,stos,cmps,lods,scas (но, возможно, это ограничение было снято на новых процессорах). Таким образом, я думаю rep nop (без точки с запятой) повторил бы a nop операция cx раза.
однако, после дальнейших поисков, я еще больше запутался. Кажется, что rep; nop и pause сопоставьте точно такой же код операции и pause немного другое поведение, чем просто nop. Некоторые Старая почта с 2005 года сказал по-другому вещи:
- "старайтесь не сжигать слишком много энергии"
- " это эквивалентно 'nop' только с 2-байтовой кодировкой."
- " это магия на intel. Это похоже на "нет, но пусть другой брат HT работает""
- "это пауза на intel и быстрое заполнение на Athlon"
С этими разными мнениями, я не мог понять правильный смысл.
это используется в ядре Linux (как i386 и x86_64 с), вместе с этим комментарий: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ также используется в BeRTOS, с тем же комментарием.
2 ответов:
rep; nopЭто действительно то же самое, чтоpauseинструкция (код операцииF390). Он может быть использован для ассемблеров, которые не поддерживаютpauseинструкции пока нет. На предыдущих процессорах это просто ничего не делало, как иnopно в двух байтах. На новых процессорах, которые поддерживают hyperthreading, он используется как подсказка процессору, что вы выполняете spinloop для повышения производительности. От ссылка на инструкцию Intel:улучшает выполнение циклов спин-ожидания. При выполнении цикла "spin-wait" Процессор Pentium 4 или Intel Xeon испытывает серьезное снижение производительности при выходе из цикла, поскольку он обнаруживает возможное нарушение порядка памяти. Инструкция PAUSE дает подсказку процессору, что кодовая последовательность является циклом ожидания спина. Процессор использует эту подсказку, чтобы избежать нарушения режима памяти в большинстве ситуаций, что значительно повышает производительность процессора. По этой причине рекомендуется сделать паузу инструкция должна быть размещена во всех циклах ожидания вращения.
префиксы, которые не применяются к инструкции, игнорируются. Однако будущие процессоры могут использовать эту последовательность байтов для кодирования новой инструкции. (да, пространство x86 opcode настолько ограничено, что они делают сумасшедшие вещи, подобные этому, и да, это усложняет декодеры.)
в этом случае это означает, что вы можете использовать
pauseв spinloops без нарушения обратной совместимости. Старые процессоры, которые не знают оpauseбудет декодировать его как NOP без вреда для себя. На новых процессорах, вы получите преимущество энергосбережения / HT дружелюбия, и избегая неправильного упорядочения памяти когда память, которую вы вращаете, меняется, и вы покидаете цикл вращения.
ссылки на руководства Intel и тонны других хороших вещей на странице информации Вики тега x86:https://stackoverflow.com/tags/x86/info
еще один случай бессмысленной
repпрефикс становится новой инструкцией на новых процессорах:lzcnt- этоF3 0F BD /r. На Процессоры, которые не поддерживают эту инструкцию (отсутствует флаг функции LZCNT в их CPUID), он декодирует какrep bsr, который работает так же, какbsr. Так что на старых процессорах он производит32 - expected_result, и не определено, когда вход был равен нулю.
один случай бессмысленным
repпрефикс, который, вероятно, никогда не будет декодировать по-другому:rep retиспользуется по умолчанию gcc при таргетинге на "общие" процессоры (т. е. не таргетинг на конкретный процессор с-marchили-mtune, а не таргетинг AMD К8 или К10.) Пройдут десятилетия, прежде чем кто-либо сможет сделать процессор, который декодируетrep retкакret, потому что он присутствует в большинстве двоичных файлов в большинстве дистрибутивов Linux. Смотрите что означает` rep ret'?
Comments