¿Se tratan algunos códigos NOP de manera diferente a otros?

12

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?

Tom Boobas
fuente
1
Me inclinaría a pensar que el segundo se ejecutaría más rápido que el primero, ya que es una instrucción en lugar de 3. Sin embargo, es posible que la canalización moderna cambie eso.
Loren Pechtel
1
¿Por qué está etiquetado c ?
Keith Thompson
Google para multi byte nop, arroja bastantes resultados.
phant0m
1
@KeithThompson: saqué las etiquetas C y de estilo de codificación; No pertenecían.
@ phant0m: ¿pondrías ese comentario en una respuesta y resumirías algunos de los resultados más relevantes? No todos tenemos los antecedentes para comprender adecuadamente lo que volvería de esa búsqueda.

Respuestas:

2

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.

ddyer
fuente
Una vez trabajé en un ensamblador (¿8085?) Que ofrecía la opción de reemplazar múltiples NOP con una sola instrucción JMP. Obtuviste la alineación que querías sin pagar la penalización de rendimiento. Práctico cuando tenía cadenas en PIC, no tan útil si tenía bucles de sincronización basados ​​en CPU (por lo que estaba desactivado de forma predeterminada).
TMN
La mayoría de las veces, la instrucción NOP se usa para insertar un breve retraso, generalmente como resultado de alguna dependencia de hardware o erratas del dispositivo. La penalización de rendimiento es la razón para usar el NOP.
Uɐɪ
1
los nops tienen muchos usos esotéricos. Algunas arquitecturas tienen requisitos de alineación de bytes para saltos. El código de auto-modificación (¡horrores!) Usaba nops como puntos de empalme. Los sistemas de errores usaban nops para almacenar información sobre aserciones fallidas.
ddyer
@ddyer: algunos procesadores tienen instrucciones (a veces documentadas, a veces no) que buscarán un byte de memoria e ignorarán el valor recuperado por completo, o no harán nada con él excepto establecer marcas que al programador no le importen. En el 6502, era bastante común usar la instrucción "BIT abs" como medio de engullir los siguientes dos bytes; También hay algunos códigos de operación no documentados que se comportan de manera similar, excepto que no actualizan ningún indicador. Sin embargo, una advertencia con tales trucos: hará que se lea un byte de espacio de direcciones. Algunos periféricos 6502 pueden reaccionar a las operaciones de lectura.
supercat
0

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?

TMN
fuente
Aunque muchos ensambladores 6502 usan el "NOP" mnemotécnico para códigos de operación no documentados que realizan una recuperación de memoria (por ejemplo, NOP $ 1FF9) sería una instrucción de dos bytes que lee la dirección 0x1FF9 e ignora el valor leído), no esperaría que un fabricante de chips use el término "nop" para una instrucción que haga algo más que adelantar el contador del programa / puntero de instrucción ya que no hay garantía de que un procesador no se enganche al hardware que desencadena acciones (por ejemplo, cambiar al banco de códigos 1) cuando ciertas direcciones (como 0x1FF9 ) se accede y dicha activación no es exactamente "ninguna operación".
supercat