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

 
 
 
Reply to this topicStart new topic
> Assembler в CrossWorks 1.5, Как вставить функции, написанные на ассемблере в код C.
SimpleSoft
сообщение Jan 26 2006, 11:52
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 273
Регистрация: 3-11-05
Пользователь №: 10 442



День добрый.
Столкнулся с проблемой, связанную с тем, что надо написать процедуры на ассемблере, которые в свою очередь надо вызывать из С кода.
Как не бился, не видит функции написанные на ASM.
Делал так:

asm.s :

.extern InitRoutine
.extern DoneRoutine

InitRoutine:
mov R12, PC
stdbm SP!, {R12, LR}
...
...

DoneRoutine:
mov R12, PC
...


Затем в asm.h
extern int InitRoutine(int param1, int param2);
extern int DoneRoutine(int param1, int param2);

А в основной программе делаю:

#include "asm.h"

int main(void)
{
InitRoutine(1,2);
....
DoneRoutine(3,4);
....
}

Линкер выдает ошибку:
undefined reference to `InitRoutine()'

Как можно заставить увидеть мою функцию?
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jan 26 2006, 11:59
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(SimpleSoft @ Jan 26 2006, 16:52) *
День добрый.
Столкнулся с проблемой, связанную с тем, что надо написать процедуры на ассемблере, которые в свою очередь надо вызывать из С кода.
Как не бился, не видит функции написанные на ASM.
Делал так:

asm.s :

.extern InitRoutine
.extern DoneRoutine


а asm их нужно объявить как public

public InitRoutine
public DoneRoutine


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
SimpleSoft
сообщение Jan 26 2006, 12:25
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 273
Регистрация: 3-11-05
Пользователь №: 10 442



Цитата(Andy Mozzhevilov @ Jan 26 2006, 15:59) *
Цитата(SimpleSoft @ Jan 26 2006, 16:52) *

День добрый.
Столкнулся с проблемой, связанную с тем, что надо написать процедуры на ассемблере, которые в свою очередь надо вызывать из С кода.
Как не бился, не видит функции написанные на ASM.
Делал так:

asm.s :

.extern InitRoutine
.extern DoneRoutine


а asm их нужно объявить как public

public InitRoutine
public DoneRoutine


Спасибо, но никак:

Error: bad instruction `public InitRoutine'

Похоже нет такой директивы.

Сообщение отредактировал SimpleSoft - Jan 26 2006, 12:29
Go to the top of the page
 
+Quote Post
SimpleSoft
сообщение Jan 26 2006, 12:56
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 273
Регистрация: 3-11-05
Пользователь №: 10 442



Может у кого есть пример данной реализации? Пробежал Help бегло - решение проблемы не нашел.
Go to the top of the page
 
+Quote Post
Andy Great
сообщение Jan 26 2006, 18:05
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 793
Регистрация: 5-11-04
Из: Краматорск, Украина
Пользователь №: 1 057



может _InitRoutine? так было в х86 системах...
Go to the top of the page
 
+Quote Post
SimpleSoft
сообщение Jan 26 2006, 18:44
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 273
Регистрация: 3-11-05
Пользователь №: 10 442



Решил проблему использованием .global и переименовыванием расширения cpp в c
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jan 27 2006, 04:37
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(SimpleSoft @ Jan 26 2006, 23:44) *
Решил проблему использованием .global


В каждом асме свои заморочки.

Цитата
и переименовыванием расширения cpp в c


Чтож ты сразу не написал, что у тебя cpp. Говорил по чисто Ц код.
Из cpp можно вызывать ц-шные или асмовые функции, но объявление их прототипов
нужно обернуть в
extern "C" {
}


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Jan 27 2006, 07:12
Сообщение #8


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Базис Си++ smile.gif
Прототипы функций, написанных и откомпилированных в Си (без плюсов) в Си++ объявляются через extern "C" ...
В Вашем случае:
extern "C" int InitRoutine(int param1, int param2);
extern "C" int DoneRoutine(int param1, int param2);

Точно так же объявляются функции, написанные в Си++, если их нужно вызывать из модулей, написанных в Си (или в асме).
Go to the top of the page
 
+Quote Post
SimpleSoft
сообщение Jan 28 2006, 12:05
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 273
Регистрация: 3-11-05
Пользователь №: 10 442



Цитата(AndyBig @ Jan 27 2006, 11:12) *
Базис Си++ smile.gif
Прототипы функций, написанных и откомпилированных в Си (без плюсов) в Си++ объявляются через extern "C" ...
В Вашем случае:
extern "C" int InitRoutine(int param1, int param2);
extern "C" int DoneRoutine(int param1, int param2);

Точно так же объявляются функции, написанные в Си++, если их нужно вызывать из модулей, написанных в Си (или в асме).


Как иногда нехватает полноценного знания С и С++, а также их различий... wink.gif
Go to the top of the page
 
+Quote Post
Alex03
сообщение Jan 29 2006, 08:55
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Ну и как вариант можно небольшие асм-функции и в встроенном асме писать, а
соответствующие функции с __attribute__((naked))
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Jan 29 2006, 10:01
Сообщение #11


Иногдящий
****

Группа: Свой
Сообщений: 691
Регистрация: 28-02-05
Пользователь №: 2 931



Цитата
Как иногда нехватает полноценного знания С и С++, а также их различий...

"Этточно" ( (С)Белое солнце пустыни) smile.gif
Вообще, С++ - довольно сложная штука, лично я встречал не так уж много людей, более-менее полно знающих его smile.gif. Сам-то я бесконечно далек от полного знания smile.gif.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:59
Рейтинг@Mail.ru


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