SimpleSoft 0 26 января, 2006 Опубликовано 26 января, 2006 · Жалоба День добрый. Столкнулся с проблемой, связанную с тем, что надо написать процедуры на ассемблере, которые в свою очередь надо вызывать из С кода. Как не бился, не видит функции написанные на 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()' Как можно заставить увидеть мою функцию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_Mozzhevilov 0 26 января, 2006 Опубликовано 26 января, 2006 · Жалоба День добрый. Столкнулся с проблемой, связанную с тем, что надо написать процедуры на ассемблере, которые в свою очередь надо вызывать из С кода. Как не бился, не видит функции написанные на ASM. Делал так: asm.s : .extern InitRoutine .extern DoneRoutine а asm их нужно объявить как public public InitRoutine public DoneRoutine Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SimpleSoft 0 26 января, 2006 Опубликовано 26 января, 2006 (изменено) · Жалоба День добрый. Столкнулся с проблемой, связанную с тем, что надо написать процедуры на ассемблере, которые в свою очередь надо вызывать из С кода. Как не бился, не видит функции написанные на ASM. Делал так: asm.s : .extern InitRoutine .extern DoneRoutine а asm их нужно объявить как public public InitRoutine public DoneRoutine Спасибо, но никак: Error: bad instruction `public InitRoutine' Похоже нет такой директивы. Изменено 26 января, 2006 пользователем SimpleSoft Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SimpleSoft 0 26 января, 2006 Опубликовано 26 января, 2006 · Жалоба Может у кого есть пример данной реализации? Пробежал Help бегло - решение проблемы не нашел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy Great 0 26 января, 2006 Опубликовано 26 января, 2006 · Жалоба может _InitRoutine? так было в х86 системах... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SimpleSoft 0 26 января, 2006 Опубликовано 26 января, 2006 · Жалоба Решил проблему использованием .global и переименовыванием расширения cpp в c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_Mozzhevilov 0 27 января, 2006 Опубликовано 27 января, 2006 · Жалоба Решил проблему использованием .global В каждом асме свои заморочки. и переименовыванием расширения cpp в c Чтож ты сразу не написал, что у тебя cpp. Говорил по чисто Ц код. Из cpp можно вызывать ц-шные или асмовые функции, но объявление их прототипов нужно обернуть в extern "C" { } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 5 27 января, 2006 Опубликовано 27 января, 2006 · Жалоба Базис Си++ :) Прототипы функций, написанных и откомпилированных в Си (без плюсов) в Си++ объявляются через extern "C" ... В Вашем случае: extern "C" int InitRoutine(int param1, int param2); extern "C" int DoneRoutine(int param1, int param2); Точно так же объявляются функции, написанные в Си++, если их нужно вызывать из модулей, написанных в Си (или в асме). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SimpleSoft 0 28 января, 2006 Опубликовано 28 января, 2006 · Жалоба Базис Си++ :) Прототипы функций, написанных и откомпилированных в Си (без плюсов) в Си++ объявляются через extern "C" ... В Вашем случае: extern "C" int InitRoutine(int param1, int param2); extern "C" int DoneRoutine(int param1, int param2); Точно так же объявляются функции, написанные в Си++, если их нужно вызывать из модулей, написанных в Си (или в асме). Как иногда нехватает полноценного знания С и С++, а также их различий... ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex03 0 29 января, 2006 Опубликовано 29 января, 2006 · Жалоба Ну и как вариант можно небольшие асм-функции и в встроенном асме писать, а соответствующие функции с __attribute__((naked)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 5 29 января, 2006 Опубликовано 29 января, 2006 · Жалоба Как иногда нехватает полноценного знания С и С++, а также их различий... "Этточно" ( (С)Белое солнце пустыни) :) Вообще, С++ - довольно сложная штука, лично я встречал не так уж много людей, более-менее полно знающих его :). Сам-то я бесконечно далек от полного знания :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться