|
|
  |
Assembler в CrossWorks 1.5, Как вставить функции, написанные на ассемблере в код C. |
|
|
|
Jan 26 2006, 11:52
|
Местный
  
Группа: Участник
Сообщений: 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()'
Как можно заставить увидеть мою функцию?
|
|
|
|
|
Jan 26 2006, 11:59
|

Знающий
   
Группа: Свой
Сообщений: 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
--------------------
Пасу котов...
|
|
|
|
|
Jan 26 2006, 12:25
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 27 2006, 04:37
|

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

|
Цитата(SimpleSoft @ Jan 26 2006, 23:44)  Решил проблему использованием .global В каждом асме свои заморочки. Цитата и переименовыванием расширения cpp в c Чтож ты сразу не написал, что у тебя cpp. Говорил по чисто Ц код. Из cpp можно вызывать ц-шные или асмовые функции, но объявление их прототипов нужно обернуть в extern "C" { }
--------------------
Пасу котов...
|
|
|
|
|
Jan 27 2006, 07:12
|

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

|
Базис Си++  Прототипы функций, написанных и откомпилированных в Си (без плюсов) в Си++ объявляются через extern "C" ... В Вашем случае: extern "C" int InitRoutine(int param1, int param2); extern "C" int DoneRoutine(int param1, int param2); Точно так же объявляются функции, написанные в Си++, если их нужно вызывать из модулей, написанных в Си (или в асме).
|
|
|
|
|
Jan 28 2006, 12:05
|
Местный
  
Группа: Участник
Сообщений: 273
Регистрация: 3-11-05
Пользователь №: 10 442

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

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

|
Цитата Как иногда нехватает полноценного знания С и С++, а также их различий... "Этточно" ( (С)Белое солнце пустыни)  Вообще, С++ - довольно сложная штука, лично я встречал не так уж много людей, более-менее полно знающих его  . Сам-то я бесконечно далек от полного знания  .
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|