- Что
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
(без точки с запятой) повторил бы nop
операцию cx
раз.
Однако после дальнейших поисков я запутался еще больше. Кажется, что rep; nop
и pause
отображается на один и тот же код операции и pause
имеет немного другое поведение, чем просто nop
. В одной старой почте от 2005 года говорилось о другом:
- "постарайтесь не сжигать слишком много энергии"
- "это эквивалентно nop только с двухбайтовой кодировкой".
- "Это магия на разведке. Это как" нет, но пусть другой брат HT бежит ""
- "это пауза на Intel и быстрое дополнение на Athlon"
С этими разными мнениями я не мог понять правильного значения.
Он используется в ядре Linux (как на i386, так и на x86_64 ) вместе с этим комментарием: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
Он также используется в BeRTOS с тем же комментарием.