سؤال

إذا حاولت تجميع الكود التالي ، أحصل على خطأ 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 كاملة في Assembler ، وأحاول تعلم ذلك. ؛)

إيفان

هل كانت مفيدة؟

المحلول

لا تذكر أي خطأ على stdout Invoke ، لذلك أفترض أن هذا واحد يجمع. في هذه الحالة ، يجب أن يكون الخطأ هو ما يقوله بالضبط: لم يتم التعرف على STRCMP في الملفات التي أدرجتها. لذا ، فقط تأكد من أن أحدهم يتضمنون بالفعل يعرّف STRCMP (وبما أنني لا أتذكر ما هو وضع MASM الافتراضي ، فإن احترام حساسية الحالة على الجانب الآمن).

نظرًا لأنك تستخدم STDCALL ، فإن استدعاءك سوف يكون مرجعًا خارجيًا إلى شيء مثل _strcmp@8 (@8 لأن هناك parms ، كل منها 4 بايت). لذلك ستحتاج أيضًا إلى وجود هذا الاسم المزين في أحد libs includelib. ليست هذه هي المشكلة التي تراها ، لأن هذا الخطأ هو Masm بدلاً من أحد الرابط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top