PDA

View Full Version : external asm file در VC



zoncpp
سه شنبه 27 آذر 1386, 09:50 صبح
سلام!
در ویندوز 64بیتی کد اسمبلی به صورت inline کامپایل نمی شود و خطا می دهد.
یک راه نوشتن کد اسمبلی، استفاده از فایل asm در پروژه برنامه می باشد. به این صورت که به پروژه VC یک فایل asm. اضافه می کنیم که تمام کدهای اسمبلی تحت توابع مختلف در این فایل پیاده سازی می شود. و در سورس برنامه این توابع اسمبلی را فراخوانی می کنیم.
من در پروژه VC خودم این کار رو کردم، ولی با فراخوانی یکی از توابع اسمبلی در سورس برنامه، خطا می دهد و پروژه کامپایل نمی شود.( خطای don't resolve )
گویا فایل asm. در پروژه تنظیمات خاصی را نیاز دارد که من نمی دانم. می تونید کمکم کنید؟

zoncpp
سه شنبه 11 دی 1386, 13:31 عصر
کسی تجربه استفاده از کد اسمبلی در یک پروژه VC رو نداره ؟؟؟؟ (برای کامپایل در ویندوز 64یتی)
چون پروژه من یک درایور هست که برای استفاده در ویندوزهای 64بیتی باید در همین ویندوز(64بیتی) کامپایل بشه .
؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

Inprise
سه شنبه 11 دی 1386, 13:34 عصر
خروجی خطا رو کامل بذار اینجا

zoncpp
سه شنبه 11 دی 1386, 15:46 عصر
خطا این هست :
unresolved external symbol function name

Inprise
سه شنبه 11 دی 1386, 16:31 عصر
اونو که فهمیدم . ولی مشخص نیست که کجا این خطا گرفته شده . خروجی دیباگر رو کامل بذار

zoncpp
چهارشنبه 12 دی 1386, 12:24 عصر
Test_externalASMDlg.obj : error LNK2001: unresolved external symbol @sieve@0
Debug/Test_externalASM.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

sieve ، نام تابع تعریف شده در فایل asm است. زمانی که در کد خودم این تابع رو فراخوانی می کنم این خطا را دریافت می کنم. لازم به ذکر است که declare این تابع و include فایل asm در کد خودم آورده شده.

zoncpp
پنج شنبه 13 دی 1386, 09:25 صبح
من مشکل دارم، چی کار کنم.:گریه:

Nima_NF
جمعه 14 دی 1386, 01:27 صبح
خوب توضیح ندادید تا بدانم که چه کار هایی انجام داده اید و چه کار هایی نداده اید، به هر حال :

تذکر 1) اول از همه قبل اعلان تابع در فایل Cpp آن را با extern "C" شروع کنید تا کامپایلر تابع را تغییر نام ندهد و یا به قولی decorate نکند.

تذکر 2) برای کامپایل هم به صورت فایل جداگانه باید custom build برای آن فایل asm تعریف کنید تا بداند که فایل asm شما زا باید کامپایل و به obj تبدیل کند:
1- بر روی فایل .asm در پروژه راست کلیک کرده و سپس انتخاب properties (فقط همین فایل) .
2 - در بخش command در قسمت custom build اطلاعات مخصوص کامپایل آن را وارد کنید:(به مراجع command-line options مراجعه کنید )
مثلا :



ml -c -Zi "-Fl$(IntDir)\$(InputName).lst" "-Fo$(IntDir)\$(InputName).obj" "$(InputPath)"

در بخش output آن :
$(IntDir)\$(InputName).obj

(نکته : برای 64 بیت ml64.exe و حذف /coff در ml64 و ...)
و یا با مسیر ml مورد نظر شما :



y:\vstudio\masm611\bin\ml /c /Cx /coff $(inputpath)

در بخش output آن :
$(InputName).obj

Inprise
جمعه 14 دی 1386, 03:43 صبح
اطلاعاتی که دادی کمی متناقض هست . واقعا داری یک "درایور" میسازی ؟ داری با DDK کار میکنی ؟ چه تنظیماتی انجام دادی ؟ بهر حال مشکلی که الان داری مربوط به زمان لینک هست . یعنی یا Obj ات به درستی با Libهای مناسب لینک نشده و در برنامه اصلی ات در دسترس نیست یا تابع اش رو به درستی در برنامه اصلی ات معرفی نکردی ، یا Calling Convention بکار رفته غلط بوده . یک نگاهی به این مثال (http://www.codegurus.be/codegurus/Programming/assembler&win64_en.htm) بنداز و ببین میتونی کامپایل و استفاده اش کنی یا نه . ( اگر جواب همه اینها منفی بود در جواب بعدیت نسخه مورد استفاده ویژوال استودیو و DDK رو هم بگو ، و بگو از کدوم روش برای تنظیم DDK و ویژوال استودیو استفاده کردی )