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

 
 
> Keil: как из C-программы вызвать процедуру на ассемблере, чтение нудной кейловской документации е помогает :(
alexunder
сообщение Mar 25 2007, 23:01
Сообщение #1


unexpected token
****

Группа: Свой
Сообщений: 899
Регистрация: 31-08-06
Из: Мехелен, Брюссель
Пользователь №: 19 987



Люди, помогите тупому!
Есть проект в Keil, написанный на C51. Есть модуль для управления индукатором, написанный на ASM51. Хочется из основной С-программы, вызывать ассемблерные рутины. Каким макаром это можно сделать? Как надо правильно объявить процедуру?
Из кейловской документации, честно признаюсь, ничего не понял sad.gif


--------------------
А у тебя SQUID, и значит, мы умрем.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Stanislav
сообщение Mar 25 2007, 23:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987



51-м Кейлом не пользовался, но в ARM-овском проблемм не возникало. В хэлпе есть главы "Inline Assembly" и "Interfacing C to Assembler". Там более-менее ясно всё прописано. Главное - знать ран-тайм модель компилятора: в каких регистрах передаются параметры в функцию, в каких возвращается значение, как производятся операции с памятью. Ну, и в операциях со стэком, понятное дело, нужно разобраться.
Не думаю, что для 51-го различия столь уж кардинальны.
Объявляется же функция и вызывается совершенно обычным для С образом.
Если зададите вопрос конкретнее, может, и ответ получите более конкретный. smile.gif


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
globalist
сообщение Mar 25 2007, 23:59
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 7-02-06
Из: Moscow
Пользователь №: 14 086



Цитата(alexunder @ Mar 26 2007, 00:01) *
Люди, помогите тупому!
Есть проект в Keil, написанный на C51. Есть модуль для управления индукатором, написанный на ASM51. Хочется из основной С-программы, вызывать ассемблерные рутины. Каким макаром это можно сделать? Как надо правильно объявить процедуру?
Из кейловской документации, честно признаюсь, ничего не понял sad.gif


Я это делал. Ничего сложного.В документации это где-то точно было. Кроме того смотри Help в программе и посмотри примеры, там точно есть. Причем есть как вызовы ASM из C, так и наоборот. Я, если не ошибаюсь подсмотрел в примерах по ISD_51. Там в ASM функции отладчика, а из C-шного файла они вызываются. Там главное не забыть их объявить public и назвать как-то определенным образом. И еще header-file не забыть.
Go to the top of the page
 
+Quote Post
repairDV
сообщение Mar 26 2007, 03:40
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 578
Регистрация: 7-11-06
Из: Хабаровск
Пользователь №: 22 044



Привет. Это делается так.
//===== файл 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
//========================

Извиняюсь, программа этого сайта убирает лишние пробелы между словами. Я попытался сейчас подредактировать - увеличить пробел, но не получается. Т.е, чтобы было понятнее. Так что, будьте внимательнее. Я не виноват, это - они.

Сообщение отредактировал repairDV - Mar 26 2007, 03:52


--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
Go to the top of the page
 
+Quote Post
oran-be
сообщение Apr 2 2007, 20:45
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



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

Вообще то там еще все проще. Главное, чтобы в .asm'е было объявление PUBLIC точек входа в функции, причем тут есть тонкость - если функция имеет входные (насчет возврата не помню) параметры, то метка входа в функцию должна быть с подстрочником, а если нет - то без. Если что не так - линкер ругнется.
Соответственно можно вызывать из ассемблера СИшные функции, только в asm'е необходимо указать EXTRN (code ) имя функции соответсвенно с подстрочником или без.
Go to the top of the page
 
+Quote Post
Snaky
сообщение Apr 11 2007, 05:12
Сообщение #6


Mute Beholder
***

Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754



Вот тут подробно описано http://keil.com/support/docs/50.htm . Однако учтите, что файл, содержащий главную функцию программы main(), не может содержать ассемблерных вставок. Выделяйте функции с ассемблерными вставками в отдельные файлы. (см. тут http://onembedding.com/tools/keil/faq/#id11 )


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post

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

 


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


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