- Що це
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
map, і той самий код операції , і 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 , з тим самим коментарем.