2010-12-28 16 views
41

¿Cómo se compila el código ensamblador con Visual Studio?Compilación de ensamblaje en Visual Studio

Quiero compilar y ejecutar un archivo fuente de ensamblaje en Visual Studio 2010.

He creado un proyecto de Visual C++ y se inserta un código de ensamblaje en un archivo code.asm:

.586    ;Target processor. Use instructions for Pentium class machines 
.MODEL FLAT, C ;Use the flat memory model. Use C calling conventions 
.STACK   ;Define a stack segment of 1KB (Not required for this example) 
.DATA    ;Create a near data segment. Local variables are declared after 
        ;this directive (Not required for this example) 
.CODE    ;Indicates the start of a code segment. 

clear PROC 
    xor eax, eax 
    xor ebx, ebx 
    ret 
clear ENDP 
END 

Sin embargo, el problema es cuando tratas de recopilar la información, que se obtiene:

LINK : error LNK2001: unresolved external symbol _mainCRTStartup 

Fui y habilité la personalización de compilación masm.targets (clic derecho en el proyecto > personalizaciones de compilación ...), pero fue en vano.

+0

Y para * depurar * asm (ver registros y un solo paso desde puntos de interrupción) con Visual Studio: https://stackoverflow.com/questions/46394685/debugging-asm-with-visual-studio-register-content -will-not-display. Ver también otros enlaces de asma x86 en [la wiki de la etiqueta x86] (https://stackoverflow.com/tags/x86/info). –

Respuesta

49

Me parece que la costumbre construir reglas para archivos .asm no está habilitada. Haga clic derecho en el proyecto, Custom Build Rules, marque "Microsoft Macro Assembler". Con la directiva "END clear" y la deshabilitación de los enlaces incrementales obtengo una compilación limpia.

Es diferente de partida desde el VS2010:

  1. Haga clic derecho Proyecto, personalizaciones Construir, marque "masm".
  2. Haga clic en el archivo .asm, Propiedades, cambie Tipo de artículo a "Microsoft Macro Assembler".
+0

es masm parte de VS? – paulm

+4

Está en el mío. Tiende a ser preguntado por programadores que usan la edición Express. –

+3

En las versiones posteriores de Visual Studio (2015 por ejemplo) debe seguir esta ruta: Proyecto -> (clic con el botón derecho) -> Dependencias de compilación -> Personalizaciones de compilación ...-> (control) masm – Alex

8

Visual Studio incluye el macroensamblador MASM. Los fragmentos más pequeños de código de ensamblador a menudo se escriben en inline assembly en un programa C o C++.

Para integrar un archivo de ensamblador en un proyecto de Visual Studio, cree un proyecto de C/C++ regular (línea de comando o GUI) y simplemente agregue un archivo que termina en .asm a la lista de archivos de origen.

Para especificar claro como el punto de entrada, siga estas instrucciones:

  1. Abrir cuadro de diálogo Páginas de propiedades del proyecto. Para obtener detalles, consulte Configuración de Propiedades del proyecto de Visual C++.

  2. Haga clic en la carpeta Enlazador.

  3. Haga clic en la página de propiedades Avanzada.

  4. Modificar la propiedad Punto de entrada.

(que fue tomada desde el Visual Studio documentation.)

puedo confirmar la instrucción de Hans Passant. Además, de acuerdo con this article, si primero agrega la casilla de verificación "mas personalizaciones de construcción" y luego agrega el archivo, se reconocerá automáticamente como un archivo de ensamblador. Además, no especificar el nombre del punto de entrada en la directiva END, sino que especificarlo en la configuración del proyecto también me funciona.

0

El problema es que su código de ensamblaje es solo una función. Para compilar y vincular, debe tener un procedimiento de inicio como Main en C/C++. Puede especificar el símbolo de inicio especificando en su directiva END. Al igual que:

END clear 

O si lo desea, puede vincular el archivo .obj generada con la C/C++ generada .obj uno.

+0

Agregué 'END clear', (en lugar de solo' END'), sin dados. – bobobobo

+0

Como esto es VC++, debe estar buscando un archivo C con la función Principal. La solución final funcionaría si está utilizando simplemente ensamblador y enlazador puro. –

+0

En realidad, END no fue necesario para que funcione: simplemente tiene que especificar '/ entry: clear' para el enlazador. – bobobobo

10

Línea de comandos:

compilar el código con:

ml /c /Cx /coff code.asm 

Se obtiene code.obj como la salida.

Enlace con:

link code.obj /SUBSYSTEM:console /out:go.exe /entry:clear 

Ahora puede ejecutar go.exe.

alternativa, hacerlo todo de una sola vez con:

ml /Cx /coff code.asm /link /SUBSYSTEM:console /link /entry:clear 

Visual Studio (no resuelto)

+0

Puede editar la línea de enlace en el cuadro de diálogo de propiedades del proyecto para especificar/ingresar: borrar./out: se especifica automáticamente, como code.obj. Suponiendo que code.obj se ensambla bien y el error está vinculando, esto debería solucionarlo. El comando que se está ejecutando está en la página avanzada de este árbol. –

+0

La versión completa debe ser 'ml/Cx/coff code.asm/link/SUBSYSTEM: console/out: go/entry: clear' not' ml/Cx/coff code.asm/link/SUBSYSTEM: console/link/entry : claro' –

Cuestiones relacionadas