0

次のコードをアセンブルしようとすると、A2006エラーが発生します(エラーA2006:未定義のシンボル:StrCmp)。

これが私のコードです:

.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

私はアセンブラーで完全なn00bであり、それを学ぼうとしています。;)

イヴァン

4

1 に答える 1

1

StdOutの呼び出しでエラーについて言及していないので、これがアセンブルされていると思います。この場合、エラーは正確に次のようになります。リストしたインクルードファイルでStrCmpが認識されません。したがって、インクルードの1つが実際にStrCmpを定義していることを確認してください(MASMのデフォルトのモードを覚えていないため、大文字と小文字を区別して安全を確保してください)。

stdcallを使用しているため、invokeは_StrCmp @ 8のような外部参照を生成します(2つのパラメーターがあり、それぞれが4バイトであるため@ 8)。したがって、この装飾された名前をincludelibライブラリの1つに含める必要もあります。ただし、このエラーはリンカーのエラーではなくmasmのエラーであるため、これは現在発生している問題ではありません。

于 2010-04-05T12:01:15.183 に答える