С++ и MS COFF

Тема в разделе "LANGS.C", создана пользователем Sashok, 14 фев 2010.

  1. Sashok

    Sashok New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    52
    Всем привет.
    Имею несколико неплохих програмок написаных на FASM.
    Подскажите пожалуста как можно эти програмки внедрить в
    C++ прграмму?
    Компилятор FASM'а умеет создавать MS Coff файлы, проблемма
    собственно в том, что я не знаю как их использовать в программах C++.
    Помогите хто чем может?
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    преобразовать эти .obj в .lib
     
  3. Sashok

    Sashok New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    52
    Не могли бы вы немного подробней
    описать етот процес.
     
  4. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Sashok
    проэкспортировать интерфейсные функции в какойнить из понимаемых С++ конвенций (например, С)

    проэкстернить их заголовки в С++ сорсе.

    пользоваться
     
  5. Asterix

    Asterix New Member

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

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Код (Text):
    1. #include <stdio.h>
    2. #include <tchar.h>
    3.  
    4. extern "C" {
    5. unsigned __cdecl factorial(unsigned);
    6. unsigned __stdcall fibonacci(unsigned);
    7. }
    8.  
    9. int _tmain(void)
    10. {
    11.     unsigned    val;
    12.  
    13.     _tscanf_s(__T("%u"), &val);
    14.  
    15.     _tprintf_s(__T("factorial(%u) = %u\n"), val, factorial(val));
    16.     _tprintf_s(__T("fibonacci(%u) = %u\n"), val, fibonacci(val));
    17. }
    Код (Text):
    1. format  MS COFF
    2.  
    3. public  factorial as '_factorial'       ; __cdecl convention
    4. public  fibonacci as '_fibonacci@4'     ; __stdcall convention
    5.  
    6. section '.text' code readable executable
    7.  
    8. factorial:
    9.         mov     ecx, [esp+4]
    10.         xor     eax, eax
    11.         inc     eax
    12.         jecxz   .finish
    13.         xor     edx, edx
    14.     .loop:
    15.         mul     ecx
    16.         loop    .loop
    17.     .finish:
    18.         retn
    19.  
    20. fibonacci:
    21.         mov     eax, [esp+4]
    22.         xor     ecx, ecx
    23.         xor     edx, edx
    24.         or      ecx, eax
    25.         mov     eax, edx
    26.         jz      .finish
    27.         inc     edx
    28.     .loop:
    29.         xadd    eax, edx
    30.         loop    .loop
    31.     .finish:
    32.         retn 4
    В настройках проекта в "Компоновщик/Ввод/Дополнительные зависимости" добавить путь к .obj файлу.
     
  7. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Если проекты на FASM используют API, то в продолжение примера см. FASM\EXAMPLES\MSCOFF.
     
  8. Sashok

    Sashok New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    52
    Спасибо большое,вы мне очень помогли.
     
  9. Sashok

    Sashok New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    52
    KeSqueer ваш С++ код не компилируется(Microsoft Visual Studio .NET 2003).
    Я его немного изменил:

    #include <stdio.h>
    #include <tchar.h>

    extern "C" {
    unsigned __cdecl factorial(unsigned);
    unsigned __stdcall fibonacci(unsigned);
    }

    int _tmain(void)
    {
    unsigned val;

    scanf(__T("%u"), &val);

    printf(__T("factorial(%u) = %u\n"), val, factorial(val));
    printf(__T("fibonacci(%u) = %u\n"), val, fibonacci(val));

    Теперь копилируется но видает ошибку:

    Linking...
    LIBCD.lib(wincrt0.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function _WinMainCRTStartup

    Debug/MS Coff C++.exe : fatal error LNK1120: 1 unresolved externals


    Так в чем дело?
     
  10. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    1 Проект console а не gui
    2 смешивание char и tchar - ошибочно
     
  11. Sashok

    Sashok New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    52
    Проект консольный.
    При компиляции кода без изминений :

    MSCoffC++.cpp
    error C3861: '_tscanf_s': identifier not found, even with argument-dependent lookup
    error C3861: '_tprintf_s': identifier not found, even with argument-dependent lookup
    error C3861: '_tprintf_s': identifier not found, even with argument-dependent lookup


    Каким компилятором вы это компилировали?
     
  12. treekool

    treekool Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    88
    Sashok
    Попробуй функцию int _tmain(void) поменяй на int WinMain или на main(), но при main, в параметрах линкера укажи /entry:"mainCRTStartup".
     
  13. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Проект собирался в 2008 студии, уверен, что в 2005 тоже должно компилироваться и линковаться.

    Если проект консольный, этой ошибки быть не может:
    Не имею под рукой 2003 .NET студию, не могу проверить. Но раз уж проблема есть, то такое должно работать:
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. extern "C" {
    4. unsigned __cdecl factorial(unsigned);
    5. unsigned __stdcall fibonacci(unsigned);
    6. }
    7.  
    8. int main(void)
    9. {
    10.     unsigned    val;
    11.  
    12.     scanf("%u", &val);
    13.  
    14.     printf("factorial(%u) = %u\n", val, factorial(val));
    15.     printf("fibonacci(%u) = %u\n", val, fibonacci(val));
    16. }
    При условии, что если в настройках можно указать, использовать многобайтовую или юникод-кодировку с выбором многобайтовой.
     
  14. Sashok

    Sashok New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    52
    treekool,KeSqueer огромное вам спасибо все работает.