Tengo curiosidad sobre esto, digamos que tengo:
00000000001 90 nop
00000000002 90 nop
00000000003 90 nop
¿Se ejecuta exactamente igual que esto?
00000000001 0F1F00 nop dword [ds:rax]
¿Qué efecto tendría el segundo ejemplo en comparación con el primero?
multi byte nop
, arroja bastantes resultados.Respuestas:
Depende de la arquitectura de la máquina. El clásico KA-10 (pdp-10) tenía muchos códigos nop, probablemente una consecuencia de su conjunto de instrucciones altamente regular, y el hecho de que todo fue implementado por componentes discretos, no por microcódigo. Algunos NOP hicieron referencia a la memoria, algunos fueron pruebas de omisión que nunca se omitieron, pero sin embargo probaron la condición que podría haber provocado una omisión, y así sucesivamente. "JFCL 0", fue anunciado en el manual como el nop más rápido.
fuente
Parece que el segundo ejemplo debería ejecutarse más rápido que el primero. En el primer ejemplo, se ejecutarán tres instrucciones separadas. En el segundo, solo una instrucción. Los NOP de varios bytes están destinados a ser utilizados para "sugerencias" de CPU (exactamente cómo y cuándo es aparentemente confidencial ). Pueden ser útiles para fines de alineación (para iniciar un bucle cerrado en una línea de caché), pero actualmente no tienen otro uso. No está claro si la CPU realmente evalúa los argumentos, por lo que no es posible decir si aumenta el tiempo de decodificación de la instrucción o incurre en una penalización de acceso a la memoria. ¿Alguien con un buen ICE quiere probar uno de estos y ver qué direcciones aparecen en el rastreo de un bus?
fuente