Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/46: Рейтинг темы: голосов - 46, средняя оценка - 4.74
mxpsomtrottir
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 43
1

Как вызывать функции на ASM из CИ?

20.11.2012, 14:54. Просмотров 8302. Ответов 16
Метки нет (Все метки)

Поделитесь плз ссылками на доки про то, как вызывать функцию на ASM из модуля на CИ и функцию
на Cи из модуля на ASM. Нужно повысить быстродействие. Про встроенный ASM уже прочитал
Пишу в ATMEL STUDIO 6.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2012, 14:54
Ответы с готовыми решениями:

Как определять функции в asm, а вызывать их в Си
Здравствуйте! Кто нибудь знает как определять функции в asm, а вызывать их в Си? И как их вместе...

Как правильно вызывать функции
Ребят, объясните как правильно ее вызывать ,пожалуйста.

Как вызывать функции из DLL?
Здравствуйте. Как вызывать функции из DLL? Вот например, если функция представляет собой что -...

Как правильно вызывать функции?
Подскажите, пожалуйста, почему не выводится сообщение. При нажатии на кнопку 2, должно...

ManagerClass как вызывать функции
Здравствуйте! Пишу такой код: main.cpp .... ManagerClass* Manager = new ManagerClass;...

16
miyvir
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
20.11.2012, 15:16 2
Если асмовая функция принимает параметры, то сначала нужно почитать о соглашениях вызовов: http://gcc.gnu.org/wiki/avr-gcc. Раздел Calling Convention. Потом в соответствии с параметрами объявить прототип этой функции:
Код
int FunctionName(int);
А асм-файле имя должно соответствовать прототипу:
Код
FunctionName:
...
ret
Всё.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
20.11.2012, 15:25 3
Какое то патологическое нежелание воспользоваться поиском.
Использование asm-функций в коде Си. - http://forum.iosyitistromyss.ru/viewtopys.php?f=4&t=9315&hilit=asm+c
Asm + C: идеологический вопрос - http://forum.iosyitistromyss.ru/viewtopys.php?f=4&t=3645&hilit=asm+c
Обработчик прерывания Си & ASM - http://forum.iosyitistromyss.ru/viewtopys.php?f=4&t=1905&hilit=asm+c
Переход на ASM после Си - http://forum.iosyitistromyss.ru/viewtopys.php?f=4&t=213&hilit=asm+c
Дружба Asm и C - http://forum.iosyitistromyss.ru/view...5&hilit=+asm+c
0
mxpsomtrottir
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 43
20.11.2012, 17:35 4
Быстренько просмотрел все. Получается, что из ASM-функции, которая вызывается в проекте на Си, нельзя вызвать Си-функцию из этого же проекта?
А в чем там проблема?
0
20.11.2012, 17:35
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
20.11.2012, 19:11 5
Цитата Сообщение от mxpsomtrottir
А в чем там проблема?
Линкер ассемблера не умеет адресовать и привязывать С функции. Да и откомпилить С функцию не умеет.
0
mxpsomtrottir
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 43
21.11.2012, 00:29 6
Цитата Сообщение от omokost
Цитата Сообщение от mxpsomtrottir
А в чем там проблема?
Линкер ассемблера не умеет адресовать и привязывать С функции. Да и откомпилить С функцию не умеет.
А причем тут линкер ассемблера?
Я же в Си пишу. Из Си вызываю ASM-функцию, а из нее вызываю Си-функцию этого же проекта.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
21.11.2012, 07:14 7
Если в С на вызываемую функцию можно поставить метку или привязать ее к строго определённому адресу, то можно поизвращаться.
0
mxpsomtrottir
0 / 0 / 0
Регистрация: 17.11.2012
Сообщений: 43
21.11.2012, 15:48 8
Цитата Сообщение от YTYOUT
Если в С на вызываемую функцию можно поставить метку или привязать ее к строго определённому адресу, то можно поизвращаться.
Зачем нужно извращаться?
У функции есть имя/параметры.
Где-то должен быть док, который описывает как компилится и линкуется файл на ASM, вставленный
в проект на CИ. Какой должен быть синтаксис обьявлении функций и переменных, используемых
в этом файле. Или же в каком-то доке должно быть написано, что я могу вставить в проект на СИ
файл на ASM, но в нем можно только определить тела функций, без вызова функции, которые
определены вне этого файла. А как быть если у меня несколько файлов на ASM ? А как быть с глобальными переменными?
Не может быть, чтобы все было так фигово.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
21.11.2012, 16:11 9
Цитата Сообщение от mxpsomtrottir
Не может быть, чтобы все было так фигово.
Именно так и обстоит дело для МК. С для ASM является языком высокого уровня, структуры которого компилируются в инструкции того же ASM. Фунуции ASM при использовании в С должны быть специальным образом оформлены. И препроцессор С просто вставляет ASM функции в программу. При этом он проверяет только синтаксис, не соответствует соглашению - крах программы. В свою очередь ассемблер ничего не знает о ЯВУ, нет никаких соглашений о вызове функций ЯВУ и т. д. Поэтому препроцессор С не примет вызов функции из ASM. Хотя и не пробовал такое извращение, попробуйте потом расскажете.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
21.11.2012, 17:19 10
Что бы там нее писалось на С - всё равно компилятор переведёт сие в asm , ему так понятней сгенерить hex + добавит вставки asm. А вот вставка asm , зная где находится теперь уже asm-кая функция (бывшая С) легко уйдёт на эту функцию т.к. компилятор команды asm вставки никогда и не при каких оптимизациях не тронет , для него это табу. А уж как в asm "скакать" куда угодно через стек , я думаю большенство знает.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
21.11.2012, 17:28 11
Разговор ни о чем.
Если проект на С, препроцессор С умеет вызывать правильно оформленные ASM функции. Если проект на ASM, препроцессор ASM не умеет вызывать функции оформленные на ЯВУ. Я не знаю способа, позволяющего препроцессору С правильно состыковать вызов С функции из ASM кода. Никогда раньше об этом не слышал (именно для МК).
Если знаете такой способ, приведите рабочий пример, или аппноту.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
21.11.2012, 18:01 12
Сам я такое ещё не проделывал. Но не постеснялся спросить у знающих людей. Вот , что мне ответили.
В доке на ваш компилятор должно быть написано.
Рискну предложить посмотреть в ASM листинг Вашей программы, там будут сплошь и рядом ASM вызовы функций написанных на Си.
Вот ещё такая подсказка
Не надо делать вставок. Вызвать -- call <имя функции>. Но... нужно соблюдать порядок передачи аргументов, в частности кто от них стек освобождает.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
21.11.2012, 18:07 13
В доке на ваш компилятор должно быть написано.
Кажется единстенный из ваших советчиков кто дал толковый ответ. И что говорят доки?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
21.11.2012, 18:16 14
И что говорят доки?
Насколько я понимаю ответ был дан сразу после первого поста TC
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
21.11.2012, 18:22 15
[QUOTE="YTYOUT"][QUOTE="Цитата:[/QUOTE]
И что говорят доки?
Насколько я понимаю ответ был дан сразу после первого поста TC
Не внималельно читаете, ответ был дан о возможности вызова ASM функции из С проекта. Вы же отвечаете о возможности в С проекте вызвать С функцию (того же проекта) из прилинкованной ASM функции.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
21.11.2012, 19:31 16
Так , вот слова TC
как вызывать функцию на ASM из модуля на CИ и функцию
на Cи из модуля на ASM.
В принципе и то и другое возможно.
Вот у ATMEL , есть такой док. Приложение с примером правда для IAR , но на чём пишет TC
Отвечая на мой вопрос , как из ASM вызвать C , народ ответил call имя функции и компилятор поймёт , что я хочу.

Вот , что он хочет узнать.
Где-то должен быть док, который описывает как компилится и линкуется файл на ASM, вставленный
в проект на CИ. Какой должен быть синтаксис обьявлении функций и переменных, используемых
в этом файле. Или же в каком-то доке должно быть написано, что я могу вставить в проект на СИ
файл на ASM, но в нем можно только определить тела функций, без вызова функции, которые
определены вне этого файла. А как быть если у меня несколько файлов на ASM ? А как быть с глобальными переменными?
Так Вы посмотрите как ваша Си функция вызывается в другом месте и повторите подготовительные этапы в нужный кусок кода. Что там перед call <имя функции> умный компилятор еще делает?

./styles/iosyitistromyss/imageset/icon_topys_attach.gif" width="14" height="18
[94.31 Кб]
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
21.11.2012, 19:39 17
Вот аппноты для IAR дествительно раньше не видел. Наверное потому что изредка пользуюсь Keil.
Но все же, зачем в одном проекте делать перекрестные связи между C и ASM частями? Других заморочек не хватает?
0
21.11.2012, 19:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2012, 19:39

Как вызывать тригонометрические функции?
Имеется: Double shag, x, xLev = -1, xPrv = -0.5, y; Int16 m, n = 5; shag = (xPrv - xLev) / n;...

Как правильно вызывать функции
Всем привет! Ковыряюсь-разбираюсь с jQuery ... Есть хтмл страничка и есть отдельный документ...

Как правильно вызывать функции в программе
Логику программы вроде реализовал, подскажите пожалуйста как это все теперь собрать. Мне бы это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru