2010-11-08 14 views
11

Sto provando a creare un programma helloworld utilizzando solo le librerie masm e non masm32. Ecco il frammento di codice:errore LNK2001: simbolo esterno non risolto _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 

Sono in grado di assemblare questo 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 

Tuttavia, sono in grado di collegarlo:

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 

Sto includendo le librerie durante il collegamento, quindi non sono sicuro del motivo per cui dice ancora i simboli non risolti?

UPDATE:

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 

UPDATE 2: codice di lavoro finale!

.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 

risposta

17

I nomi delle funzioni corrette sono [email protected] e [email protected].

Quasi tutte le funzioni API Win32 sono stdcall, quindi their names are decorated con un segno @ seguito dal numero di byte occupati dai relativi parametri.

Inoltre, quando una funzione Win32 accetta una stringa, esistono due varianti: una che accetta una stringa ANSI (il nome termina con A) e una che accetta una stringa Unicode (il nome termina con W). Stai fornendo una stringa ANSI, quindi desideri la versione A.

Quando non si programma in assembly, il compilatore si occupa di questi punti.

+0

Grazie! Questo ha risolto uno degli errori di collegamento ma non l'altro .. vedi l'aggiornamento – Jumbo

+0

Buon punto, vedi la mia modifica. –

+0

Fantastico! ha funzionato perfettamente ora. Mi sento come un n00b - puoi suggerire qualche documento/libro da cui scegliere tutte queste cose? MSDN è troppo scoraggiante per esplorare quando sei un principiante. – Jumbo

5

Prova ad aggiungere questo prima .data segmento:

include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\user32.lib 
Problemi correlati