Всем привет. Мне очень интересно узнать, можно ли написать функцию на C++ (например в Visual Studio 7) и потом её использовать в программе на ассемблере (на MASM).
ммм..А можно узнать как? Я пытался запускать компилятор C++, что б он генерировал ассемлерный лист cl /FA /c name.asm Он генерирует асм лист, но в нём прописаны какие то инклуды. И когда подключаешь такой лист в ассемблерный проект, МАСМ начинает ругаться, что надо кучу файлов дополнительно подключить. И ещё у меня cl не хочет компилировать файл в котором содержится любой include. Пишет что не может найти. Почему так?
Rito Зависит от того, где хранится скомпилированный модуль, написанный на С++. Если это dll, то надо посмотреть, под какими именами экспортируются методы объектов, а затем последовательно вызвать конструктор объекта (если есть), и желаемый метод. Имена будут декорированны, надо быть к этому готовым. Для вызова потребуются API LoadLibrary + GetProcAddress. Второй вариант -- слинковать исполняемый с dll/obj статически. Для этого все равно нужны имена методов, а детали линковки зависят от компилятора/ассемблера. Насчет include -- если не может найти файлы, подключенные как include<>, то слетели настройки IDE. В опциях IDE можно указать, где следует искать файлы, подключаемые таким образом. Как конкретно -- зависит от самой IDE. Если препроцессор не может найти файл, подключенный как include"", то, вероятно, заголовочный файл просто лежит "не там". Поиск подключенных таким образом файлов идет относительно директории, где лежит .c файл.
С DLL всё отлично. Можно поподробнее теперь об соединении не DLL С++ на ассме. Т.е. допустим могу ли я создать cpp файл, написать в нём какую то функцию (на С++ естественно). А потом эту функцию как то внедрить в проект на асме. Если можно то как? У меня различные ошибки выводятся, например: unmatched block nesting и другие. Возвожно я просто не так делаю. Заранее спасибо
Rito Вы-бы пример функи на ++ и асм файл и батник с вашими действиями выложили. Глядишь и вопрос-бы поскорей решился
По умолчанию, при компиляции сишного текста, в соответствии с настройками в IDE, компилятор тулит в объектный файл много всякой билеберды. Те же рантаймы, стандартные либы, етс. Вот "Какие то инклюды", это видимо они и есть. Нужно поодключать все это в настройках, что бы получить "чистый" OBJ. Объявить сишную ф-цию как public, в асмовом тексте как extern с указанием конвенции передачи параметров, не забыть про дополнительные символы, которые сишный компилятор добавляет к именам ф-ций. Должно получится. Ну и еще, конечно, надо учитывать имена сегментов, в зависимости от того как будет вызываться ф-ция, far или near.
Что то у меня 2 дня wasm.ru был не доступен. Странности какие то Для примера. У меня есть функция на C int TestProcedure(int temp) { temp ++; return temp; } Получаю obj файл так: Через командную строку cl /c /FA 1.cpp А дальше что? Пробовал через include подключить асм файл сишной функции. Пробовал в батник вбивать свой obj. Может какой нить примерчик небольшой. Что бы представлять вообще как это делается
Масм прекрасно съест obj файл, сделаный Visual C++, как родной. При этом всего лишь надо указать этот obj файл при линковке. Что-то вроде Code (Text): link /subsystem:windows prog.obj c.obj prog.obj программа на Масм, c.obj - на С++.
Сьедать то он сьедает, а вызвать то теперь как Объявляю в асм программе так: extern ?test@@YAHXZ:near и он пишет что unresolved external symbol _?test@@YAHXZ
Rito лучше подавлять декорацию имен при компиляции obj/lib, используйте скобочки #ifdef __cplusplus extern "C" { #endif void test(void); #ifdef __cplusplus } #endif
Да, ещё у меня такой вопрос возник. Функцию то я подключаю. Всё работает. А как в эту сишную функцию подключить скажем банальный windows.h. При cl /c /FA 1.cpp он мне выдаёт что не может найти. Можно кинуть прямо туда нужный инклуд, но можно ли как то проще?
а как инклюд подключаешь? всмысле Code (Text): #include <windows.h> или Code (Text): #include <windows> или Code (Text): #include "windows.h" Проверь. 2 - едят только некоторые мелкомягкие.
Суть в том, что VC видит инклуды. Если я пишу проект чисто на C++, всё отлично работает и никаких проблем у меня нет. Мне же надо всего лишь написать допустим функцию на С++. Если я создаю проект С++ и делаю там одну функцию то при компиляции получаю какой то маленький obj, который не хочет подключаться к масм прожекту. Если же я компилирую через командную строку сишный компилятор, то он не хочет находить инклуды.
Если ты компилируешь через командную строку, то и путь к папке с инклюдами ты должен указать. Когда ты делаешь проект С++, IDE при компиляции формирует параметры ком строки. Здесь же - ручками.
Вопрос то в том, как через командную указывать путь к папке с инклудами. Есть в сишном файле #include <windows.h> Если я пропишу таким образом #include <path/windows.h> у меня компиль начинает требовать указать excpt.h и т.д. А как указать сразу для всех инклудов путь в командной строке? Когда же я делаю прожект, я не могу получить чистый obj. Щас копаюсь в настройках студии, но пока х.з. что мне там может помочь. Если кто знает, очень уж надо.