*.asm в VC6

Тема в разделе "LANGS.C", создана пользователем Freecod, 14 июл 2008.

  1. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Не хочу возиться с полным переносом asm программы на Си. Подключаю нужный файл в проекту, заменяю start: на
    Код (Text):
    1. .code
    2. PUBLIC _cleanoff
    3. _cleanoff PROC NEAR
    4. ; здесь был start:
    5. ; ...
    6. _cleanoff endp
    У меня VC6, так что добавил файл, в настройках настроил компиляцию (С:\masm32\bin\ml.exe /c /coff /nologo $(InputPath) \ .\$(InputName).obj)

    Файл собирается в объектник без проблем.
    Теперь хочу вызвать его из x.cpp
    В шапке
    extern "C" void cleanoff ();
    вызов
    cleanoff();

    При линковке x.obj
    x.obj : error LNK2001: unresolved external symbol _cleanoff
    Release/x.exe : fatal error LNK1120: 1 unresolved externals

    Что забываю? Что не так?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Freecod
    Одно из двух, либо что-нибудь с манглами либо не подрубил либу. Не знаю как в VC6, но в 2003 в опциях линкера -Additional dependencies.
     
  3. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    А что добавляем сообственно в Additional dependencies? Есть Dependencies с возможностью добавки на вкладке Custom Build (свойства файла *.asm в проекте). У cpp файла зависимости не изменяются... статейки про это нет, хотя бы на 2003 VC?
     
  4. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Хм, когда я в 2005-2008 студии подключал asm-файл к проекту, достаточно было объявить в нем ее как PUBLIC, а в сишном коде просто по имени вызывать, типа так:
    Код (Text):
    1. ....
    2. PUBLIC INT3
    3. ...
    Код (Text):
    1. extern "C"
    2. {
    3. void INT3();
    4. ....
    5. }
    6. .....
    7. INT3();
     
  5. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    надо собрать в lib, а его подключить к проекту на С:

    Код (Text):
    1. #pragma comment(lib, "x.lib");
     
  6. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Попробуй в .asm'е просто cleanoff, а не _cleanoff.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    x.obj или просто x.
     
  8. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Сторонний вопрос, чтоб не создавать лишнюю тему - половина мегабайта, 524288 байт всегда будет выровненным размером? Или может код небольщой подскажите для вычисления ближайшего к полумегабайту выровненного размера? Нужно для MapViewOfFile, двигаю окно, а оно только на выровненный размер сдвигается...
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Freecod
    MapViewOfFile ... только на выровненный размер сдвигается
    Речь о SYSTEM_INFO.dwAllocationGranularity?
     
  10. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Можно поподробнее? Да, требуется такой размер, близкий к полмегабайта, на который можно сдвигать MapViewOfFile.
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Freecod
    Код (Text):
    1. ...
    2. static DWORD WINAPI GetPageSize(void)
    3. {
    4.   SYSTEM_INFO si;
    5.   GetSystemInfo(&si);
    6.   return si.dwAllocationGranularity;
    7. }
    8.  
    9. ...
    10.  
    11. DWORD half   = 512 * 1024 * 1024;
    12. DWORD size   = GetPageSize();
    13. DWORD result = ((half >= size) ? half  - (half % size) : size);
    14. ...
     
  12. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Спасибо, помогло, всё робит
     
  13. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    или _cleanoff@0
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Брутфорс конечно хорошо, но по-моему проще посмотреть каким-нибудь PE браузером.
     
  15. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    А как собрать .asm в lib?
     
  16. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Для MASM и VC++ я делал так:

    В def файле:

    Код (Text):
    1. LIBRARY Example
    2. EXPORTS
    3. needed_proc ; подставить свою
    Далее bat'ник для сборки:

    Код (Text):
    1. set cmpl=X:\masm32
    2. %cmpl%\bin\ml /nologo /c /coff /Cp /I%cmpl%\include\ lib.asm
    3. %cmpl%\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:%cmpl%\lib /DLL /DEF:lib.def lib.obj
    4. %cmpl%\bin\link -lib lib.obj
    5. del *.exp
    6. del *.obj
    7. pause
    Далее вызов подключение и вызов из программы на С++:

    Код (Text):
    1. #pragma comment (lib, "lib.lib")
    2.  
    3. extern "C" {
    4. void _stdcall needed_proc(/* parameters list */);
    5. }
    6.  
    7. int main(int argc, char* argv[])
    8. {
    9. needed_proc(/* parameters list */);
    10. return 0;
    11. }
     
  17. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Отлично, всё работает как задуманно, спасибо =)
    PS Пришёл к выводу, вставив тот же файл в проект на vs2003 - VC6 не хочет нормально использовать паблик функции.
     
  18. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Наткнулся на странную проблему - подключаю lib, вызываю функцию, (кстати, этот асм-файл это отключение WFP из одной из статей от зелёного к красному) и после этого вызываю DeleteFile (удаляю обычный не относящийся к wfp файл), а у функции на входе int 3 \ ret. Что такое?