C++ в АСМ

Тема в разделе "WASM.ASSEMBLER", создана пользователем Rito, 3 июн 2008.

  1. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Всем привет.
    Мне очень интересно узнать, можно ли написать функцию на C++ (например в Visual Studio 7) и потом её использовать в программе на ассемблере (на MASM).
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Можно.
     
  3. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    ммм..А можно узнать как?
    Я пытался запускать компилятор C++, что б он генерировал ассемлерный лист
    cl /FA /c name.asm
    Он генерирует асм лист, но в нём прописаны какие то инклуды. И когда подключаешь такой лист в ассемблерный проект, МАСМ начинает ругаться, что надо кучу файлов дополнительно подключить.
    И ещё у меня cl не хочет компилировать файл в котором содержится любой include. Пишет что не может найти. Почему так?
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Rito
    Зависит от того, где хранится скомпилированный модуль, написанный на С++. Если это dll, то надо посмотреть, под какими именами экспортируются методы объектов, а затем последовательно вызвать конструктор объекта (если есть), и желаемый метод. Имена будут декорированны, надо быть к этому готовым. Для вызова потребуются API LoadLibrary + GetProcAddress. Второй вариант -- слинковать исполняемый с dll/obj статически. Для этого все равно нужны имена методов, а детали линковки зависят от компилятора/ассемблера.

    Насчет include -- если не может найти файлы, подключенные как include<>, то слетели настройки IDE. В опциях IDE можно указать, где следует искать файлы, подключаемые таким образом. Как конкретно -- зависит от самой IDE. Если препроцессор не может найти файл, подключенный как include"", то, вероятно, заголовочный файл просто лежит "не там". Поиск подключенных таким образом файлов идет относительно директории, где лежит .c файл.
     
  5. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    С DLL всё отлично.
    Можно поподробнее теперь об соединении не DLL С++ на ассме.
    Т.е. допустим могу ли я создать cpp файл, написать в нём какую то функцию (на С++ естественно). А потом эту функцию как то внедрить в проект на асме. Если можно то как?
    У меня различные ошибки выводятся, например:
    unmatched block nesting
    и другие.
    Возвожно я просто не так делаю.
    Заранее спасибо
     
  6. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Rito
    Вы-бы пример функи на ++ и асм файл и батник с вашими действиями выложили. Глядишь и вопрос-бы поскорей решился
     
  7. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    По умолчанию, при компиляции сишного текста, в соответствии с настройками в IDE, компилятор тулит в объектный файл много всякой билеберды. Те же рантаймы, стандартные либы, етс. Вот "Какие то инклюды", это видимо они и есть. Нужно поодключать все это в настройках, что бы получить "чистый" OBJ. Объявить сишную ф-цию как public, в асмовом тексте как extern с указанием конвенции передачи параметров, не забыть про дополнительные символы, которые сишный компилятор добавляет к именам ф-ций. Должно получится. Ну и еще, конечно, надо учитывать имена сегментов, в зависимости от того как будет вызываться ф-ция, far или near.
     
  8. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Что то у меня 2 дня wasm.ru был не доступен. Странности какие то
    Для примера. У меня есть функция на C
    int TestProcedure(int temp)
    {
    temp ++;
    return temp;
    }
    Получаю obj файл так:
    Через командную строку cl /c /FA 1.cpp
    А дальше что? Пробовал через include подключить асм файл сишной функции. Пробовал в батник вбивать свой obj.
    Может какой нить примерчик небольшой. Что бы представлять вообще как это делается
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Масм прекрасно съест obj файл, сделаный Visual C++, как родной. При этом всего лишь надо указать этот obj файл при линковке. Что-то вроде
    Код (Text):
    1. link /subsystem:windows prog.obj c.obj
    prog.obj программа на Масм, c.obj - на С++.
     
  10. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Сьедать то он сьедает, а вызвать то теперь как
    Объявляю в асм программе так:
    extern ?test@@YAHXZ:near
    и он пишет что
    unresolved external symbol _?test@@YAHXZ
     
  11. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ну так объявить надо так: extern _?test@@YAHXZ:near
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Rito
    лучше подавлять декорацию имен при компиляции obj/lib, используйте скобочки

    #ifdef __cplusplus
    extern "C" {
    #endif
    void test(void);
    #ifdef __cplusplus
    }
    #endif
     
  13. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Подавление декорации имён помогло. Огромное всем спасибо.
     
  14. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Да, ещё у меня такой вопрос возник.
    Функцию то я подключаю. Всё работает. А как в эту сишную функцию подключить скажем банальный windows.h.
    При cl /c /FA 1.cpp
    он мне выдаёт что не может найти. Можно кинуть прямо туда нужный инклуд, но можно ли как то проще?
     
  15. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а как инклюд подключаешь?
    всмысле
    Код (Text):
    1. #include <windows.h>
    или
    Код (Text):
    1. #include <windows>
    или
    Код (Text):
    1. #include "windows.h"
    Проверь.
    2 - едят только некоторые мелкомягкие.
     
  16. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    ИМХО есть wasm.beginners для таких тем
     
  17. n0hack

    n0hack New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2008
    Сообщения:
    71
    Если VС не видит инклуды - проверь переменные окружения
     
  18. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Суть в том, что VC видит инклуды. Если я пишу проект чисто на C++, всё отлично работает и никаких проблем у меня нет. Мне же надо всего лишь написать допустим функцию на С++. Если я создаю проект С++ и делаю там одну функцию то при компиляции получаю какой то маленький obj, который не хочет подключаться к масм прожекту. Если же я компилирую через командную строку сишный компилятор, то он не хочет находить инклуды.
     
  19. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    Если ты компилируешь через командную строку, то и путь к папке с инклюдами ты должен указать. Когда ты делаешь проект С++, IDE при компиляции формирует параметры ком строки. Здесь же - ручками.:)
     
  20. Rito

    Rito New Member

    Публикаций:
    0
    Регистрация:
    30 май 2008
    Сообщения:
    59
    Вопрос то в том, как через командную указывать путь к папке с инклудами.
    Есть в сишном файле #include <windows.h>
    Если я пропишу таким образом
    #include <path/windows.h>
    у меня компиль начинает требовать указать excpt.h и т.д. А как указать сразу для всех инклудов путь в командной строке?
    Когда же я делаю прожект, я не могу получить чистый obj. Щас копаюсь в настройках студии, но пока х.з. что мне там может помочь.
    Если кто знает, очень уж надо.