fasm(1.asm) -> 1.obj легко, но вот как еще в придачу 1.lib чтобы меня MS VC++ 6.0 понял?

Тема в разделе "WASM.BEGINNERS", создана пользователем EvilsInterrupt, 30 июн 2006.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Вобщем на писала проект на фасме:
    Код (Text):
    1. ;===================================================================== ==
    2.     format MS COFF
    3. ;===================================================================== ==
    4.     public collision
    5. ;===================================================================== ==
    6. include '%fasminc%\win32ax.inc'
    7. ;===================================================================== ==
    8.  
    9. section '.code' code readable executable
    10.  
    11. collision:
    12.     push ebp
    13.     mov ebp,esp
    14.     mov eax,String
    15.     pop ebp
    16.     ret
    17. ;===================================================================== ==
    18.  
    19. section '.data' readable writeable
    20.  
    21. String  db  'the Collision',0


    чтобы меня понял ms visual c++ 6.0 мне надо не только Coff`овский obj но и lib!!! А как его получить?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А .lib очень надо?



    В принципе, можно и без него -- добавь требуемый файл в список линкуемых (Project Settings ->Link ->Object/library modules).



    Т.е. там не только .lib можно указывать.
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Код (Text):
    1. proba.obj : error LNK2001: unresolved external symbol _Collision
    2. Debug/proba.exe : fatal error LNK1120: 1 unresolved externals
    3. Error executing link.exe.


    Хотя этот obj перевел в omf и дельфи 7.0 его схавал



    В свойствах проекта все стандартно, только obj добавил:

    kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib proba_coff.obj /nologo /subsystem:console /incremental:yes /pdb:"Debug/proba.pdb" /debug /machine:I386 /out:"Debug/proba.exe" /pdbtype:sept
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    в proba.cpp:



    extern "C" char* collision();
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Кстати, extern "C" почему-то не помогает.



    Внешний символ в proba.obj будет импортирован как _Collision. Отчего так происходит, честно говоря, не знаю (вроде, коневенция ставится __cdecl?..).



    В общем, если надо "чтобы работало", надо сэкспортировать так: public collision as '_collision'.
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    EvilsInterrupt

    Ну, он же английским языком жалуется, что нет нигде символа _Collision, а в ассемблерном листинге collision с маленькой буквы и без знака подчёркивания.
    Код (Text):
    1. public collision as '_Collision'




    Mika0x65



    Сишное соглашение добавляет знак подчёркивания.
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Quantum

    Эта строка должна быть в проекте фасма?

    или c++ кода где-то?
     
  8. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    >Сишное соглашение добавляет знак подчёркивания.

    Извините что матчасть не знаю, но не мог ли бы вы разъяснить почему ему нужно это подчеркивание?
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Quantum


    Спасибо :).



    EvilsInterrupt

    В общем, в VS объявление ф-ии такое:

    extern "C" char *Collision();



    В FASM вместо

    public collision

    должно быть

    public collision as '_Collision'
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    вот мы наконец и узнали пол EvilsInterrupt :)))
     
  11. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    девушка по имени Дима? :)
     
  12. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Mika0x65

    Или так:
    Код (Text):
    1. public _Collision
    2. ; ***
    3. _Collision:


    Линкер - простая душа, которой достаточно, чтобы имена символов совпадали с точностью до последней буковки и ничего больше.



    EvilsInterrupt



    Видимо, ещё во времена доса, MS и Borland договорились, что имена сишных функций и глобальных переменных должны начинаться со знака подчёркивания. В Линуксе такого не наблюдается. К слову, Ватком вообще добавлял подчёркивание в конце имени :)
     
  13. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Asterix

    Ну, мля, одну очепятку сделай всю жизнь форума будут помнить :)))

    Приезжай бухать, увидишь, как я "девушка" пить "не по девичьи" умею! ;)



    Матчасть, почитал у Ю.Магды со стр. 251 "Ассемблер для процессоров Intel Pentium", скажу книга "УРА СКЛАД!!!, а че такое СКЛАД?" :)



    Но для регистровой а-ля: __fastcall, это где 3 параметра всего передавться могут, непонял где должны передаться parameter1,param2,param3 ? Какой в каком регистре если, быть точнее и будет ли эта схема регистров однозначной и для Delphi ?
     
  14. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    >Линкер - простая душа,



    Упаси меня господь писать нечто вроде @download@8
     
  15. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    EvilsInterrupt

    Простота не касается реализации :)



    Это как игра в шахматы - алгоритм простой, но эффективно реализовать его реально сложно.



    EvilsInterrupt



    В MS __fastcall первый параметр в ecx. У борланда порядок другой и в posix тоже другой. Так что у всех свой __fastcall. Для совместимости лучше __stdcall или C юзать.