2010-11-08 19 views
11

Sadece masm kullanarak ve masm32 lib'leri kullanarak bir helloworld programı oluşturmaya çalışıyorum. Bunu kullanarak MASM monte edebiliyoruz duyuyorumhata LNK2001: çözümlenmemiş harici sembol _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 

: İşte kod parçacığı İşte Ancak

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 

, ben bağlamak alamıyorum: Ben kütüphanelerini dahil ediyorum

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 

bağlantı sırasında, neden hala çözülmemiş semboller söylediğinden emin değil misiniz?

GÜNCELLEME:

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 

GÜNCELLEME 2: Nihai çalışma kodu!

.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 

cevap

17

doğru işlev adları [email protected] ve [email protected] bulunmaktadır.

Neredeyse tüm Win32 API işlevleri stdcall, yani @ işaretine sahip their names are decorated ve ardından parametreleri tarafından alınan bayt sayısı.

Ayrıca, bir Win32 işlevi bir dize aldığında, iki varyant vardır: ANSI dizesini alan bir ad (ad, A içinde sona eriyor) ve bir Unicode dizesini alan addır (ad, W'da sona eriyor). Bir ANSI dizesi sağlıyorsunuz, bu yüzden A sürümünü istiyorsunuz.

Derlemede programlama yapmıyorsanız, derleyici bu noktaları sizin yerinize alır. .data segmentinde önce bu ekleme

+0

teşekkürler! Bu, bağlantı hatalarından birini çözdü, ancak diğerini değil .. bkz. Güncelleme – Jumbo

+0

İyi nokta, düzenlememe bakın. –

+0

Harika! şimdi mükemmel çalıştı. Böyle bir n00b gibi hissediyorum - tüm bu şeyleri toplayabileceğim herhangi bir belge/kitap önerebilir misin? MSDN, acemi olduğunuzda keşfetmek için çok zor. – Jumbo

5

Dene:

include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\user32.lib 
İlgili konular