реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как вызвать Си-функцию из ассемблерной части программы? (+), Blackfin
ASergej_R19
сообщение Apr 7 2007, 16:05
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 5-02-07
Из: Москва
Пользователь №: 25 060



Проект совмещает Си и асм.
В отдельном файле есть Си-функция, которую надо вызвать в отдельном файле, где все написано на асме - как это сделать?

Компилятор дает этой си-функции имя типа: c_func => c_func__Fv, но ругается, если пытаться в ассемблерной части написать типа .extern c_func__Fv...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 7 2007, 16:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(ASergej_R19 @ Apr 7 2007, 15:05) *
Компилятор дает этой си-функции имя типа: c_func => c_func__Fv,

Значит это не C а C++ smile.gif
Естественных способов (не зависимых от используемого компилятора) вызова C++ обычно нет. Посему сделайте функцию сишной и вызывайте.


P.S.
Ну и поиском, пожалуйста, пользуйтесь, ведь Вы не думете, что Вам первому встретилась такая необходимость и ранее никто не спрашивал и не отвечал....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ASergej_R19
сообщение Apr 7 2007, 16:52
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 5-02-07
Из: Москва
Пользователь №: 25 060



Посиком смотрел конечно, но не нашел ничего похожего... :-(

А за ответ - шпасибо, все заработало. Благодарствую...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 7 2007, 20:57
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Чтобы с++ ная функция без проблем могла вызываться из ассемблера она должны декларироваться как extern "C" fun(...).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 7 2007, 21:38
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(sergeeff @ Apr 7 2007, 19:57) *
Чтобы с++ ная функция без проблем могла вызываться из ассемблера она должны декларироваться как extern "C" fun(...).

После такой декларации она уже НЕ БУДЕТ C++ smile.gif и соответственно не будет иметь С плюсовый mangling.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 8 2007, 13:54
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну это же стандартно решается:

#ifdef __cplusplus
extern "C" fun (...)
#endif // __cplusplus

Для с и asm - имеем nonmangled-имя, для с++ - mangled.

Или я не прав?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 8 2007, 14:54
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(sergeeff @ Apr 8 2007, 12:54) *
Или я не прав?

Не правы. После такого вседа и для всех имеем "нормальное сишное" имя. #ifdef это просто для переносимости исходника на "C" компиляторы, которые просто не поймут extern "C"


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th June 2025 - 17:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016