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