2010-06-20 21 views
5

Según tengo entendido, un compilador convierte el lenguaje de alto nivel en código de máquina. Tengo una pregunta sobre si un compilador (por ejemplo, VC++) usa un ensamblador a su vez. Recuerdo haber visto el código de ensamblado, cada vez que se produce un bloqueo o algo así.¿Tiene un compilador también un ensamblador?

+1

Assembler es solo un mapeo uno a uno de las instrucciones de la máquina (bits de código) para algunos códigos mnemónicos (como 'mov ax, bx'). Es por eso que puede traducir códigos de ensamblaje a códigos de máquina y volver sin ningún gran esfuerzo. El compilador realiza un trabajo mucho más complicado y no existe una relación de uno a uno entre el código fuente y el código producido (no importa si se trata de un código de máquina directo o instrucciones de ensamblaje). Es por eso que generalmente no puede ver el código fuente del código binario. – ony

+0

ony: eso se aplica a un ensamblador de back-end no simbólico ni macro. Pero incluso la salida de GAS es simbólica. –

Respuesta

5

Depende del compilador; muchos compiladores pueden compilar para ensamblar. Por ejemplo, si pasa la bandera '-S' a gcc, como:

gcc -S -o test.S test.c 

que la voluntad conjunto de salida para el archivo de test.c en los test.S de archivos que se pueden ver. (Recomiendo usar -O0 si va a tratar de leer el ensamblado, porque las optimizaciones del compilador allí probablemente lo confundirán).

Como mencionó Visual C++ en su pregunta, Paul Dixon señala a continuación que Visual C++ usa the /FA flag para lograr lo mismo.

+1

Bueno, en realidad, principalmente GCC lo hace :-) La mayoría de los comerciales lo tienen para evitar la generación lenta/reparsing text step, con solo una opción para generar assembler si es necesario. –

1

Un compilador va directamente al código de máquina.

El depurador mostrará las instrucciones de código de máquina como ensamblador, pero el depurador también puede mostrar otro código que no fue compilado por el compilador.

El compilador también puede incluir un ensamblador para que pueda incluir el código ensamblador en línea con el lenguaje de nivel superior o generar salida ensamblador.

+0

no es correcto ... Podría programar un compilador que muestre solo fuente de ensamblaje, para ensamblarlo aparte con un ensamblador ... además, el compilador apenas va tan directo al código de máquina ... representación interna (diferente del bacalao de la máquina de destino) del código (!) podría ser muy útil para hacer la optimización y así sucesivamente ... ok, todo probablemente esté oculto, pero "_directly_" es demasiado de todos modos. : D – ShinTakezou

+0

No podría sino responder a la pregunta del OP Visual Studio no produce un ensamblador y luego llama a MASM para generar el exe –

1

mayoría de los compiladores tendrán una opción para ver una lista de montaje

  • VC se le puede decir a la salida de un ensamblador lista con /FA
  • con gcc, utilice las modificador -S
0

Un el compilador traduce un lenguaje de programación de alto nivel a un lenguaje de nivel inferior (como código de máquina, ensamblaje o incluso otro lenguaje de alto nivel, por ejemplo, de Vala a C, o de uC++ a C++).

No conozco VC++, pero la mayoría de los compiladores, como GNU GCC, no incluyen un ensamblador, pero invocan un programa ensamblador externo (como NASM o GNU AS).

Saludos

3

En general, un compilador traduce un idioma a otro. La mayoría de los compiladores se enfocan en el código máquina aquí están las formas más comunes de hacer esto, en orden de nivel más bajo a más alto nivel:

  1. Producir código máquina directamente, mediante la inclusión de back-ends para cada conjunto de instrucciones.
  2. Lenguaje de ensamblaje de producto, que se pasa a un ensamblador externo. Esto es lo que hace gcc. Después de todo, ¿por qué no usar ensambladores existentes? Generar códigos de operación directamente es un dolor.
  3. Genera una forma intermedia de bajo nivel del código, como LLVM bytecode, que se transforma en código de máquina. LLVM es una bendición para los escritores de compiladores, ya que maneja una gran cantidad de optimizaciones y es compatible con muchos back-ends, al mismo tiempo que le permite escribir a un nivel más alto que el ensamblado.
  4. Transforme el código en un lenguaje como C, y luego páselo a otro compilador. Facebook does this to PHP: lo compilan en C++, y luego usan gcc para compilarlo en ensamblaje, que GNU ensambla al código nativo como.

Si desea intentar escribir un compilador, le recomiendo comenzar con algo como C como el back-end. Si quieres obtener más información más tarde, prueba LLVM. Si intenta producir un lenguaje ensamblador o un código de máquina directamente, probablemente será menos eficiente que lo que produciría un compilador de C o LLVM. Hablo de una experiencia personal embarazosa en este caso.

Cuestiones relacionadas