2010-05-03 14 views
11

Estoy interesado en escribir un ensamblador x86. Me pregunto cuál es una buena manera de mapear las instrucciones mnemotécnicas de ensamblaje x86 (usando una sintaxis similar a Intel) en las instrucciones correspondientes del código de máquina binaria.¿Cómo ensamblan los ensambladores la técnica mnemotécnica x86 a las instrucciones de la máquina binaria?

+0

también leí http://stackoverflow.com/questions/2546715/how-to-analysis-how-many-bytes-each-instruction-takes-in-assembly/2761248#2761248 – claws

Respuesta

10

¿Desea comprender el mapeo físico de las teclas mnemotécnicas al código máquina? Si es así, el volumen 2A & 2B del Intel IA32/IA64 reference manuals describe el formato binario del código máquina x86.

El x86 instruction set page en Wikipedia tiene una lista compacta de todas las instrucciones clasificadas por cuando se introdujeron, lo que puede ayudarlo a priorizar qué implementar primero.

Sin embargo, si está preguntando acerca de cómo analizar un archivo de texto de código ensamblador para llegar al punto en el que su programa podría comenzar a escribir código de máquina, básicamente necesita comprender cómo escribir un compilador. Las herramientas lex y yacc son buenos lugares para comenzar, pero si no sabes cómo compilar un compilador también necesitarás obtener un libro. Creo que el Dragon book es el mejor que hay, pero hay muchos otros libros que podrías usar, así que tiene muchas recomendaciones.

+0

Es probable que no necesite un compilador completo para esto. Necesita un ensamblador simple de dos pasos con algún tipo de tabla de búsqueda. Puede que no siempre generes el mejor código de esa manera, pero obtendrás algo que funcione. –

+0

@Nathan: un ensamblador * es * un compilador completo. Tenga en cuenta que un compilador es solo un traductor de otro idioma a códigos de operación. Si cuenta todo el proceso de traducción, un ensamblador y un compilador terminan haciendo exactamente lo mismo. Simplemente sucede que la mayoría de los otros lenguajes son lo suficientemente complejos, y el lenguaje ensamblador es lo suficientemente simple, ese ensamblaje sirve como un punto medio decente, por lo que muchos compiladores separan la traducción en dos fases: traducir al ensamblaje, y hacer que un ensamblador haga el trabajo pesado en realidad generando códigos de operación. Un ensamblador normalmente no se beneficiaría de esto. – cHao

+0

@cHao: Gracias por la aclaración. Ese es un punto interesante :-) –

5

Para x86, es complicado como el infierno. Un poco menos complicado ya que los procesadores de 32 bits tomaron el control, pero sí. Todavía un dolor.

Es posible que desee echar un vistazo a nasm (http://www.nasm.us). Es un ensamblador de código abierto de 32 bits. Vea cómo lo hacen. O bien, úsalo en su lugar. :)

2

Es solo un mapeo directo uno a uno; la documentación de Intel describe todas las instrucciones y sus codificaciones. Tendrá que crear una tabla de búsqueda gigante o algo equivalente para hacer la generación de coincidencia y código.

+8

algo me dice que nunca miró codificación x86. un solo mnemónico puede corresponder a múltiples códigos de operación, cada opcode puede tener muchos prefijos, anulaciones de tamaño ... y estoy seguro de que me faltan algunas cosas. – Bahbar

+0

Escribo el código de ensamblaje x86 todos los días. Tiene que ser uno a uno, de lo contrario, ¿cómo sabes qué código de operación se emite para qué instrucción escribiste? El hecho de que haya prefijos, modificadores especiales, acceso a memoria o versiones registradas, etc. no cambia el hecho de que para cada instrucción que escriba en el archivo de ensamblaje debe saber qué instrucción de máquina se emite ... –

+0

Supongo que espalda; podría ser de varios a uno, si desea tener múltiples mnemónicos, genere la misma instrucción de máquina. Sin embargo, no puede ser uno-a-muchos, a menos que haya creado algún tipo de sensibilidad de contexto en el ensamblador. El primer caso es un trabajo innecesario, y el segundo caso parece una mala idea en general, por lo que voy a dejar que mi respuesta soporte. –

Cuestiones relacionadas