- Co to
rep; nop
znaczy? - Czy to to samo, co
pause
instrukcja? - Czy to to samo co
rep nop
(bez średnika)? - Jaka jest różnica w stosunku do prostej
nop
instrukcji? - Czy zachowuje się inaczej na procesorach AMD i Intel?
- (bonus) Gdzie jest oficjalna dokumentacja tych instrukcji?
Motywacja do tego pytania
Po krótkiej dyskusji w komentarzach do innego pytania zdałem sobie sprawę, że nie wiem, co to rep; nop;
znaczy w asemblerze x86 (lub x86-64). Nie mogłem też znaleźć dobrego wyjaśnienia w internecie.
Wiem, że rep
jest to przedrostek, który oznacza „powtórz czas następnej instrukcji cx
” (a przynajmniej tak było w starym 16-bitowym zestawie x86). Według tej tabeli podsumowującej w Wikipedii , wydaje się rep
może być używany tylko z movs
, stos
, cmps
, lods
, scas
(ale może to ograniczenie zostało usunięte w nowszych procesorów). Dlatego myślę, że rep nop
(bez średnika) powtórzyłbym nop
operację cx
razy.
Jednak po dalszych poszukiwaniach jeszcze bardziej się zdezorientowałem. Wydaje się, że rep; nop
i pause
map do dokładnie tego samego kodu operacji i pause
ma nieco inne zachowanie niż tylko nop
. Niektóre stare listy z 2005 roku mówiły różne rzeczy:
- „staraj się nie spalać zbyt dużo energii”
- „jest to odpowiednik 'nop' tylko z kodowaniem 2-bajtowym”.
- „To jest magia na temat danych wywiadowczych. To jak 'nie, ale niech ucieknie inne rodzeństwo HT'”
- „jest przerwa w informacjach i szybkie uzupełnianie informacji na temat Athlona”
Przy tych różnych opiniach nie mogłem zrozumieć właściwego znaczenia.
Jest używany w jądrze Linuksa (zarówno na i386, jak i x86_64 ), wraz z następującym komentarzem: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
Jest również używany w BeRTOS , z tym samym komentarzem.