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?
Respuesta
¿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.
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. –
@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
@cHao: Gracias por la aclaración. Ese es un punto interesante :-) –
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. :)
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.
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
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 ... –
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. –
- 1. ¿Cuál es la función de las instrucciones push/pop usadas en los registros del ensamblaje x86?
- 2. buena referencia para las instrucciones de montaje x86
- 3. x86 conjunto de instrucciones hoja de ruta
- 4. x86 tablas de codificación de instrucciones
- 5. Referencia para x86 instrucciones por funcionalidad
- 6. ¿Cómo se ensamblan las bases de datos de geolocalización?
- 7. Conjunto de instrucciones alfanumérico x86 de Turing Completo (Subconjunto)
- 8. ¿El estándar C++ requiere una máquina binaria?
- 9. Donde las instrucciones SSE superan las instrucciones normales
- 10. ¿Explicar cómo funciona el indicador de AF en las instrucciones x86?
- 11. Dirección/Signo Extender bit en conjunto de instrucciones x86
- 12. ¿Qué ensambladores actualmente son compatibles con el conjunto de instrucciones AVX?
- 13. WiX: ¿Cómo anular "C: \ Archivos de programa (x86)" en la máquina x64 en secuencia WixUI_Advanced?
- 14. ¿Cómo puedo contar las instrucciones ejecutadas en Red Hat Enterprise Linux (x86-64)?
- 15. Rendimiento de las instrucciones x86 rep en procesadores modernos (pipeline/superscalar)
- 16. ¿Por qué hay una diferencia entre los lenguajes ensambladores como Windows, Linux?
- 17. android - Cómo mostrar las instrucciones en la vista web
- 18. ¿Qué ensambladores de JVM hay?
- 19. compatibilidad binaria entre las distribuciones de Linux
- 20. ¿Cómo trata SQL Server las instrucciones dentro de los procedimientos almacenados con respecto a las transacciones?
- 21. código de la máquina de intel a la pregunta del código de ensamblaje
- 22. Xcode Debugger: cómo hacer un solo paso al nivel de las instrucciones de la CPU
- 23. ¿Qué hace la secuencia de instrucciones de ensamblaje "rep stos" x86?
- 24. Necesita ayuda para comprender las instrucciones de llamada asm E8 x86
- 25. ¿Es posible precargar los contenidos de la página con la técnica ajax/jquery?
- 26. ¿Administra activamente la deuda técnica?
- 27. Ventajas de la arquitectura basada en pila de las instrucciones de la JVM
- 28. ¿Cómo usan los compiladores modernos las instrucciones de mmx/3dnow/sse?
- 29. ¿Cómo implementan las CPU Instrucciones como MUL/MULT?
- 30. ¿Cómo hace un seguimiento efectivo de la deuda técnica?
también leí http://stackoverflow.com/questions/2546715/how-to-analysis-how-many-bytes-each-instruction-takes-in-assembly/2761248#2761248 – claws