- Cosa
rep; nop
significa? - È lo stesso
pause
dell'istruzione? - È uguale a
rep nop
(senza il punto e virgola)? - Qual è la differenza rispetto alla semplice
nop
istruzione? - Si comporta in modo diverso sui processori AMD e Intel?
- (bonus) Dov'è la documentazione ufficiale per queste istruzioni?
Motivazione per questa domanda
Dopo alcune discussioni nei commenti di un'altra domanda , mi sono reso conto che non so cosa rep; nop;
significhi nell'assembly x86 (o x86-64). E inoltre non sono riuscito a trovare una buona spiegazione sul web.
So che rep
è un prefisso che significa "ripeti i cx
tempi di istruzione successivi " (o almeno lo era, nel vecchio assembly x86 a 16 bit). In base a questa tabella riassuntiva a Wikipedia , a quanto pare rep
può essere utilizzato solo con movs
, stos
, cmps
, lods
, scas
(ma forse questa limitazione è stata rimossa su processori più recenti). Quindi, penserei rep nop
(senza punto e virgola) ripeterei nop
un'operazione cx
volte.
Tuttavia, dopo ulteriori ricerche, sono diventato ancora più confuso. Sembra che rep; nop
sia pause
mappato esattamente allo stesso codice operativo e pause
ha un comportamento leggermente diverso dal semplice nop
. Alcuni vecchi messaggi del 2005 dicevano cose diverse:
- "cerca di non bruciare troppa energia"
- "è equivalente a 'nop' solo con la codifica a 2 byte."
- "è magico su Intel. È come 'nop ma lascia correre l'altro fratello HT'"
- "è pausa su Intel e imbottitura veloce su Athlon"
Con queste diverse opinioni, non riuscivo a capire il significato corretto.
Viene utilizzato nel kernel Linux (sia su i386 che x86_64 ), insieme a questo commento: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
Viene utilizzato anche in BeRTOS , con lo stesso commento.