C++ в АСМ

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

  1. Rito

    Rito New Member

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

    censored New Member

    Публикаций:
    0
    Можно.
     
  3. Rito

    Rito New Member

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

    Mika0x65 New Member

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

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

    Rito New Member

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

    _basmp_ New Member

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

    Barbos Slavon

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

    Rito New Member

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

    Rito New Member

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

    Mika0x65 New Member

    Публикаций:
    0
    Ну так объявить надо так: extern _?test@@YAHXZ:near
     
  12. Asterix

    Asterix New Member

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

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

    Rito New Member

    Публикаций:
    0
    Подавление декорации имён помогло. Огромное всем спасибо.
     
  14. Rito

    Rito New Member

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

    max7C4 New Member

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

    deLight New Member

    Публикаций:
    0
    ИМХО есть wasm.beginners для таких тем
     
  17. n0hack

    n0hack New Member

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

    Rito New Member

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

    Barbos Slavon

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

    Rito New Member

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