2010-03-30 8 views
0

Si j'essaie d'assembler le code suivant, j'obtiens une erreur A2006 (erreur A2006: symbole indéfini: StrCmp).MASM StrCmp Undefined?

Voici mon code:

.386 
.model flat,stdcall 
option casemap:none 

include  \masm32\include\windows.inc 
include  \masm32\include\kernel32.inc 
include  \masm32\include\masm32.inc 
include \masm32\include\user32.inc 

includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\masm32.lib 
includelib \masm32\lib\stdlib.lib 
includelib \masm32\lib\user32.lib 

.data 
YvanSoftware db "(c) YvanSoftware - ALL RIGHTS RESERVED", 13 ,10 ,0 
EnterYourName db "Please enter your name: ", 0 
CRLF db 13,10,0 
TheHolyMan db "Yvan", 0 
Seriously db "Seriously? You're the MAN!", 13,10,0 
LoserName db "What a loser name.", 13,10 

.data? 
buffer db 100 dup(?) 
.code 
start: 
invoke StdOut,addr YvanSoftware 
invoke StdOut, addr EnterYourName 
invoke StdIn, addr buffer, 100 
invoke StdOut, addr CRLF 

invoke StrCmp,addr buffer, addr TheHolyMan ;error fires here 
je HolyMan 
IfNotHolyMan: 
invoke StdOut, addr LoserName 
jmp EndIfHolyMan 
HolyMan: 
invoke StdOut, addr Seriously 
jmp EndIfHolyMan 
EndIfHolyMan: 

invoke ExitProcess,0 
END start 

Je suis un n00b complet à l'assembleur, et je suis en train de l'apprendre. ;)

Yvan

+0

L'erreur signifie que le symbole StrCmp n'est pas défini :) Sérieusement, cependant - StrCmp ne fait-il pas partie du C RTL (par opposition à l'API WIN32)? IOW, il n'est défini dans aucun des modules externes que vous incluez. –

+0

Oui, mais est-il possible d'utiliser les fonctions C RTL dans Assembler? – friedkiwi

Répondre

1

Vous ne mentionnez aucune erreur sur l'invocation StdOut, donc je suppose que celui-ci rassemble. Dans ce cas, l'erreur devrait être exactement ce qu'elle dit: StrCmp n'est pas reconnu dans les fichiers d'inclusion que vous avez listés. Donc, assurez-vous que l'un de vos inclut définit réellement StrCmp (et puisque je ne me souviens pas du mode par défaut de MASM, respectez la sensibilité de la casse pour être du bon côté). Puisque vous utilisez stdcall, votre invocation génèrera une référence externe à quelque chose comme _StrCmp @ 8 (@ 8 car il y a deux paramètres, chacun étant de 4 octets). Vous devrez donc également avoir ce nom décoré dans l'une des librairies includelib. Ce n'est pas le problème que vous voyez, car cette erreur est un masm plutôt qu'un linker.