- Что
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 с тем же комментарием.