Saltar al contenido

¿Qué significa “nop dword ptr [rax+rax]” instrucciones de montaje x64 hacer?

Posteriormente a buscar en diversos repositorios y sitios al concluir hallamos la solución que te enseñamos más adelante.

Solución:

En un comentario en otra parte de esta página, Michael Petch señala una página web que describe la Intel x86 códigos de operación NOP multibyte. La página tiene una tabla de información útil, pero desafortunadamente el código HTML está desordenado y no puedes leerlo. Aquí hay información de esa página, además de que la tabla presentó una forma legible:

NOP de varios bytes
http://www.felixcloutier.com/x86/NOP.html

La instrucción NOP de un byte es un alias mnemotécnico para la instrucción XCHG (E)AX, (E)AX.

La instrucción NOP de varios bytes no realiza ninguna operación en los procesadores admitidos y genera una excepción de código de operación indefinida en los procesadores que no admiten la instrucción NOP de varios bytes.

La forma de operando de memoria de la instrucción permite que el software cree una secuencia de bytes de “sin operación” como una sola instrucción.

Para situaciones en las que se necesitan NOP de varios bytes, las operaciones recomendadas (modo de 32 bits y modo de 64 bits) son: [my edit: in 64-bit mode, write rax instead of eax.]

Length    Assembly                                     Byte Sequence
-------   ------------------------------------------   --------------------------
1 byte    nop                                          90
2 bytes   66 nop                                       66 90
3 bytes   nop dword ptr [eax]                          0F 1F 00
4 bytes   nop dword ptr [eax + 00h]                    0F 1F 40 00
5 bytes   nop dword ptr [eax + eax*1 + 00h]            0F 1F 44 00 00
6 bytes   66 nop word ptr [eax + eax*1 + 00h]          66 0F 1F 44 00 00
7 bytes   nop dword ptr [eax + 00000000h]              0F 1F 80 00 00 00 00
8 bytes   nop dword ptr [eax + eax*1 + 00000000h]      0F 1F 84 00 00 00 00 00
9 bytes   66 nop word ptr [eax + eax*1 + 00000000h]    66 0F 1F 84 00 00 00 00 00

Tenga en cuenta que la técnica para seleccionar la secuencia de bytes correcta, y por lo tanto el tamaño total deseado, puede diferir según el ensamblador que esté utilizando.

Por ejemplo, las siguientes dos líneas de ensamblaje tomadas de la tabla son aparentemente similares:

nop dword ptr [eax + 00h]
nop dword ptr [eax + 00000000h]

Estos difieren solo en la cantidad de ceros iniciales, y algunos ensambladores pueden dificultar la desactivación de su característica “útil” de codificar siempre la secuencia de bytes más corta posible, lo que podría hacer que la segunda expresión sea inaccesible.

Para la situación de NOP de varios bytes, no desea esta “ayuda” porque debe asegurarse de obtener la cantidad deseada de bytes. Entonces, el problema es cómo especificar una combinación exacta de modificación y r/m bits que termina con el deseado disipar tamaño, pero solo a través de la instrucción mnemotécnica. Este tema es complejo y ciertamente está más allá del alcance de mi conocimiento, pero Scaled Indexing, MOD+R/M y SIB podrían ser un punto de partida.

Ahora, como sé que estaba pensando, si le resulta difícil o imposible forzar la cooperación de su ensamblador a través de mnemónicos de instrucción, siempre puede recurrir a db (“definir bytes”) como una alternativa simple y sin complicaciones que, um, está garantizada para funcionar.

Como se señaló en los comentarios, es un NOP de varios bytes que generalmente se usa para alinear la siguiente instrucción con un límite de 16 bytes, cuando esa instrucción es la primera instrucción en un bucle.

Tal alineación puede ayudar con el ancho de banda de búsqueda de instrucciones, porque la búsqueda de instrucciones a menudo ocurre en unidades de 16 bytes, por lo que alinear la parte superior de un ciclo brinda la mayor posibilidad de que la decodificación ocurra sin cuellos de botella.

Podría decirse que la importancia de tal alineación es menos importante de lo que era antes, con la introducción de la búfer bucle y el caché uop que son menos sensibles a la alineación. En algunos casos esta optimización puede ser incluso una pesimización, especialmente cuando el bucle se ejecuta muy pocas veces.

Aquí tienes las reseñas y calificaciones

Si haces scroll puedes encontrar las observaciones de otros administradores, tú asimismo puedes insertar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *