Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil: как из C-программы вызвать процедуру на ассемблере
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
alexunder
Люди, помогите тупому!
Есть проект в Keil, написанный на C51. Есть модуль для управления индукатором, написанный на ASM51. Хочется из основной С-программы, вызывать ассемблерные рутины. Каким макаром это можно сделать? Как надо правильно объявить процедуру?
Из кейловской документации, честно признаюсь, ничего не понял sad.gif
Stanislav
51-м Кейлом не пользовался, но в ARM-овском проблемм не возникало. В хэлпе есть главы "Inline Assembly" и "Interfacing C to Assembler". Там более-менее ясно всё прописано. Главное - знать ран-тайм модель компилятора: в каких регистрах передаются параметры в функцию, в каких возвращается значение, как производятся операции с памятью. Ну, и в операциях со стэком, понятное дело, нужно разобраться.
Не думаю, что для 51-го различия столь уж кардинальны.
Объявляется же функция и вызывается совершенно обычным для С образом.
Если зададите вопрос конкретнее, может, и ответ получите более конкретный. smile.gif
globalist
Цитата(alexunder @ Mar 26 2007, 00:01) *
Люди, помогите тупому!
Есть проект в Keil, написанный на C51. Есть модуль для управления индукатором, написанный на ASM51. Хочется из основной С-программы, вызывать ассемблерные рутины. Каким макаром это можно сделать? Как надо правильно объявить процедуру?
Из кейловской документации, честно признаюсь, ничего не понял sad.gif


Я это делал. Ничего сложного.В документации это где-то точно было. Кроме того смотри Help в программе и посмотри примеры, там точно есть. Причем есть как вызовы ASM из C, так и наоборот. Я, если не ошибаюсь подсмотрел в примерах по ISD_51. Там в ASM функции отладчика, а из C-шного файла они вызываются. Там главное не забыть их объявить public и назвать как-то определенным образом. И еще header-file не забыть.
repairDV
Привет. Это делается так.
//===== файл C ============
extern void _prob (void);

main()
{
_prob ();

}
//======================

//===== файл ассемблера "Asmmm.a51"========
NAME Asmmm

?PR?_prob?Asmmm SEGMENT CODE

PUBLIC _prob

RSEG ?PR?_prob?Asmmm
_prob:
PUSH ACC
PUSH PSW
nop

POP ACC
POP PSW
RET

end
//========================

Извиняюсь, программа этого сайта убирает лишние пробелы между словами. Я попытался сейчас подредактировать - увеличить пробел, но не получается. Т.е, чтобы было понятнее. Так что, будьте внимательнее. Я не виноват, это - они.
oran-be
Вообще то там еще все проще. Главное, чтобы в .asm'е было объявление PUBLIC точек входа в функции, причем тут есть тонкость - если функция имеет входные (насчет возврата не помню) параметры, то метка входа в функцию должна быть с подстрочником, а если нет - то без. Если что не так - линкер ругнется.
Соответственно можно вызывать из ассемблера СИшные функции, только в asm'е необходимо указать EXTRN (code ) yfpdfybz aeyrwbq/

Вообще то там еще все проще. Главное, чтобы в .asm'е было объявление PUBLIC точек входа в функции, причем тут есть тонкость - если функция имеет входные (насчет возврата не помню) параметры, то метка входа в функцию должна быть с подстрочником, а если нет - то без. Если что не так - линкер ругнется.
Соответственно можно вызывать из ассемблера СИшные функции, только в asm'е необходимо указать EXTRN (code ) имя функции соответсвенно с подстрочником или без.
Snaky
Вот тут подробно описано http://keil.com/support/docs/50.htm . Однако учтите, что файл, содержащий главную функцию программы main(), не может содержать ассемблерных вставок. Выделяйте функции с ассемблерными вставками в отдельные файлы. (см. тут http://onembedding.com/tools/keil/faq/#id11 )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.