- Cosa
rep; nopsignifica? - È lo stesso
pausedell'istruzione? - È uguale a
rep nop(senza il punto e virgola)? - Qual è la differenza rispetto alla semplice
nopistruzione? - 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 cxtempi 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 reppuò 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 nopun'operazione cxvolte.
Tuttavia, dopo ulteriori ricerche, sono diventato ancora più confuso. Sembra che rep; nopsia pause mappato esattamente allo stesso codice operativo e pauseha 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.