Comprender los bytes nop

Comprender los bytes nop

Ok, estaba leyendo los manuales de AMD64 y sabiendo que noprealmente es un xchg eax, eax, miré xchgy encontré algo interesante, que parece que se puede codificar un byte en las instrucciones para especificar los registros (disculpas, estoy en mi iPod) :imagen.

Entonces, lo que me pregunto es cómo sabe el procesador si hay un byte después con el que trabajar o si ese registro adicional tiene que ser de un tipo rAXque haga que en realidad siga siendo el único byte.0x90

Respuesta1

Miré el xchg y encontré algo interesante: parece que se puede codificar un byte en la instrucción para especificar los registros.

Sí, así es como funcionan la mayoría de las instrucciones x86. Las instrucciones se obtienen de 32 o 64 bits a la vez (longitud de palabra de la máquina), no bytes a la vez.

Especificar un XCHGde rAXcon rAX(donde rAXestá EAXen una máquina de 32 bits y RAXen una máquina de 64 bits) será 0x90, porque el código mux de registro rAXes 0x00(efectivamente, una operación de un ciclo que no hace nada). De manera similar, la instrucción XCHG rBX, rAXse ensamblará en 0x93(el código mux de rBXBeing 0b011).

La codificación del código de operación debe aparecer en algún otro lugar del manual, o puede buscar en un mapa de código de operación x86 (que ayuda a comprender cómo se mezcla todo). Puedes encontrar uno en elManuales para desarrolladores de software de arquitecturas Intel 64 e IA-32(Volumen 2, Apéndice A.3).

Entonces, lo que me pregunto es cómo sabe el procesador si hay un byte después con el que trabajar o si ese registro adicional tiene que ser del tipo rAX, lo que hace que en realidad siga siendo el único byte 0x90.

Aquí es todo lo contrario. Para el modo de 64 bits, en realidad existe unaprefijoen la propia palabra de instrucción para indicar que ( REXprefijo). El procesador sabe qué buscar en función de la presencia o ausencia del REXprefijo y, en ausencia de él, la instrucción sigue siendo simplemente 0x90.

información relacionada