- Что означает
rep; nop
? - Это то же самое, что и инструкция
pause
? - Это то же самое, что и
rep nop
(без точки с запятой)? - Какая разница с простой инструкцией
nop
? - Одинаково ли это относится к процессорам AMD и Intel?
- (бонус) Где находится официальная документация для этих инструкций?
Мотивация по этому вопросу
После некоторого обсуждения в комментариях другого вопроса я понял, что не знаю, что означает rep; nop;
в сборке x86 (или x86-64). А также я не мог найти хорошее объяснение в Интернете.
Я знаю, что rep
является префиксом, который означает "повторить следующую команду cx
times" (или, по крайней мере, это было в старой 16-разрядной сборке x86). Согласно этой сводной таблице в Википедии, кажется, что rep
может использоваться только с movs
, stos
, cmps
, lods
, scas
(но, возможно, это ограничение было удалено на более новых процессорах). Таким образом, я бы подумал, что rep nop
(без полуколонии) повторит операцию nop
cx
раз.
Однако после дальнейшего поиска я еще больше смутился. Кажется, что rep; nop
и pause
сопоставляются с точно таким же кодом операции, а pause
имеет немного другое поведение, чем просто nop
. Некоторая старая почта с 2005 года говорила разные вещи:
- "старайтесь не сжигать слишком много энергии"
- "это эквивалентно" nop "только с 2-байтным кодированием."
- "это волшебство на Intel. Его вроде" nop, но пусть другой HT-брат работает "
- "это пауза в Intel и быстрое дополнение к Athlon"
С этими разными мнениями я не мог понять правильного значения.
Он используется в ядре Linux (на i386 и x86_64) вместе с этим комментарием: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
Также используется используемое в BeRTOS, с тем же комментарий.