- ¿Qué
rep; nop
significa? - ¿Es lo mismo que la
pause
instrucción? - ¿Es lo mismo que
rep nop
(sin el punto y coma)? - ¿Cuál es la diferencia con la
nop
instrucción simple ? - ¿Se comporta de manera diferente en procesadores AMD e Intel?
- (bonificación) ¿Dónde está la documentación oficial de estas instrucciones?
Motivación para esta pregunta
Después de una discusión en los comentarios de otra pregunta , me di cuenta de que no sé qué rep; nop;
significa en el ensamblaje x86 (o x86-64). Y tampoco pude encontrar una buena explicación en la web.
Sé que rep
es un prefijo que significa "repetir los siguientes cx
tiempos de instrucción " (o al menos lo era, en el antiguo ensamblaje x86 de 16 bits). De acuerdo con esta tabla resumen en la Wikipedia , parece que rep
sólo se puede utilizar con movs
, stos
, cmps
, lods
, scas
(pero tal vez esta limitación se eliminó en los procesadores más recientes). Por lo tanto, pensaría rep nop
(sin punto y coma) repetir una nop
operación cx
veces.
Sin embargo, después de buscar más, me confundí aún más. Parece que rep; nop
y se pause
asignan exactamente al mismo código de operación , y pause
tiene un comportamiento un poco diferente al de solo nop
. Algún correo antiguo de 2005 decía cosas diferentes:
- "intenta no quemar demasiada energía"
- "es equivalente a 'nop' solo con codificación de 2 bytes".
- "es mágico en Intel. Es como 'nop, pero deja que el otro hermano HT corra'"
- "es una pausa en Intel y un relleno rápido en Athlon"
Con estas opiniones diferentes, no pude entender el significado correcto.
Se está utilizando en el kernel de Linux (tanto en i386 como en x86_64 ), junto con este comentario: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
También se está utilizando en BeRTOS , con el mismo comentario.