Перейти к содержанию
    

Assembler в CrossWorks 1.5

День добрый.

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

Как не бился, не видит функции написанные на 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()'

 

Как можно заставить увидеть мою функцию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

День добрый.

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

Как не бился, не видит функции написанные на ASM.

Делал так:

 

asm.s :

 

.extern InitRoutine

.extern DoneRoutine

 

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

 

public InitRoutine

public DoneRoutine

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

День добрый.

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

Как не бился, не видит функции написанные на ASM.

Делал так:

 

asm.s :

 

.extern InitRoutine

.extern DoneRoutine

 

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

 

public InitRoutine

public DoneRoutine

 

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

 

Error: bad instruction `public InitRoutine'

 

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

Изменено пользователем SimpleSoft

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может у кого есть пример данной реализации? Пробежал Help бегло - решение проблемы не нашел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решил проблему использованием .global

 

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

 

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

 

Чтож ты сразу не написал, что у тебя cpp. Говорил по чисто Ц код.

Из cpp можно вызывать ц-шные или асмовые функции, но объявление их прототипов

нужно обернуть в

extern "C" {

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Базис Си++ :)

Прототипы функций, написанных и откомпилированных в Си (без плюсов) в Си++ объявляются через extern "C" ...

В Вашем случае:

extern "C" int InitRoutine(int param1, int param2);

extern "C" int DoneRoutine(int param1, int param2);

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Базис Си++ :)

Прототипы функций, написанных и откомпилированных в Си (без плюсов) в Си++ объявляются через extern "C" ...

В Вашем случае:

extern "C" int InitRoutine(int param1, int param2);

extern "C" int DoneRoutine(int param1, int param2);

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и как вариант можно небольшие асм-функции и в встроенном асме писать, а

соответствующие функции с __attribute__((naked))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

"Этточно" ( (С)Белое солнце пустыни) :)

Вообще, С++ - довольно сложная штука, лично я встречал не так уж много людей, более-менее полно знающих его :). Сам-то я бесконечно далек от полного знания :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...