2010-11-08 26 views
11

Estoy intentando crear un programa holamundo utilizando sólo masm y no MASM32 libs. Este es el fragmento de código:error: símbolo externo sin resolver _MessageBox

.386 
.model flat, stdcall 
option casemap :none 

extrn MessageBox : PROC 
extrn ExitProcess : PROC 

.data 
     HelloWorld db "Hello There!", 0 

.code 
start: 

     lea eax, HelloWorld 
     mov ebx, 0 
     push ebx 
     push eax 
     push eax 
     push ebx 
     call MessageBox 
     push ebx 
     call ExitProcess 

end start 

soy capaz de armar esta usando masm:

c:\masm32\code>ml /c /coff demo.asm 
Microsoft (R) Macro Assembler Version 9.00.21022.08 
Copyright (C) Microsoft Corporation. All rights reserved. 

Assembling: demo.asm 

Sin embargo, no puedo vincularlo:

c:\masm32\code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user 
32.lib demo.obj 
Microsoft (R) Incremental Linker Version 9.00.21022.08 
Copyright (C) Microsoft Corporation. All rights reserved. 

demo.obj : error LNK2001: unresolved external symbol _MessageBox 
demo.obj : error LNK2001: unresolved external symbol _ExitProcess 
demo.exe : fatal error LNK1120: 2 unresolved externals 

Estoy incluyendo las librerías durante la vinculación, por lo que no estoy seguro de por qué todavía dice símbolos no resueltos?

ACTUALIZACIÓN:

c:\masm32\code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user 
32.lib demo.obj 
Microsoft (R) Incremental Linker Version 9.00.21022.08 
Copyright (C) Microsoft Corporation. All rights reserved. 

demo.obj : error LNK2001: unresolved external symbol [email protected] 
demo.exe : fatal error LNK1120: 1 unresolved externals 

ACTUALIZACIÓN 2: Código de trabajo final!

.386 
.model flat, stdcall 
option casemap :none 

extrn [email protected] : PROC 
extrn [email protected] : PROC 

.data 
     HelloWorld db "Hello There!", 0 

.code 
start: 

     lea eax, HelloWorld 
     mov ebx, 0 
     push ebx 
     push eax 
     push eax 
     push ebx 
     call [email protected] 
     push ebx 
     call [email protected] 

end start 

Respuesta

17

Los nombres de las funciones son correctas [email protected] y [email protected].

Casi todas las funciones de API de Win32 son stdcall, por lo que their names are decorated con un signo @, seguido de la cantidad de bytes ocupados por sus parámetros.

Además, cuando una función Win32 toma una cadena, hay dos variantes: una que toma una cadena ANSI (el nombre termina en A) y otra que toma una cadena Unicode (el nombre termina en W). Está suministrando una cadena ANSI, por lo que desea la versión A.

Cuando no está programando en el montaje del compilador se encarga de estos puntos para usted.

+0

Gracias! Esto resuelve uno de los errores de enlace, pero no el otro .. ver Boletín – Jumbo

+0

Buen punto, ver mi edición. –

+0

¡Impresionante! funcionó perfectamente ahora Me siento como un n00b. ¿Pueden sugerir algún documento/libro donde pueda recoger todas estas cosas? MSDN es demasiado desalentador para explorar cuando eres un novato. – Jumbo

5

Trate de añadir esto antes .data segmento:

include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\user32.lib 
Cuestiones relacionadas