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

 
 
 
Reply to this topicStart new topic
> Возврат значения в регистре R0, или как избежать предупреждения
Dot
сообщение Oct 14 2005, 17:15
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 13-10-05
Пользователь №: 9 595



По соглашению, Keil С компилятор возвращает значение функции в R0.
Если я пишу функцию полностью на ассемблере, то такой код
Код
unsigned int my_function(int param1, char param2) __arm
{
__asm{
 ...........
 MOV  R0,...   //return value in R0
 }//asm
}

приводит к генерации компилятором предупреждения "no return value".

Есть ли способ сказать компилятору, что я действительно возвращаю значение в R0?

Это просто вопрос перфекциониста.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 15 2005, 11:10
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Три варианта решения:
1. Написать процедуру на ассемблере, ассемблером скомпилировать и прилинковать ко всему остальому на С.
2. Сделать так:
unsigned int my_function(int param1, char param2) __arm
{
unsigned int result;
__asm{
...........
MOV R0,... //return value in R0
MOV result, R0
}//asm
}
3. Если компилятор поддерживает объявление функции типа __declspec( naked ) (я IAR’ом никогда не пользовался), то объявляешь функцию с этим параметром, который подавляет генерацию пролога/эпилога компилятором и тогда все в твоих руках.

Успехов
Go to the top of the page
 
+Quote Post
Dot
сообщение Oct 15 2005, 13:56
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 13-10-05
Пользователь №: 9 595



Спасибо за отклик,
еще раз подчеркну, что все и так работает как надо, просто раздражают ненужные предупреждения, особенно когда их много.

По 2-- все так, только концовка пишется иначе:

MOV R0,... //return value in R0
LDR R1,=result
STR R0,[R1]
}//asm
return (result);
}

что приводит к генерации кучи ненужного кода ("из пустого в порожнее").

По 3 -- есть атрибут __task для объявления функции (использую uVision, компилятор от Keil), который подавляет генерацию пролога-эпилога, вот только функция эта должна быть строго void function(void).
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Oct 17 2005, 03:24
Сообщение #4


Знающий
****

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



Цитата(Dot @ Oct 15 2005, 18:56)
Спасибо за отклик,
еще раз подчеркну, что все и так работает как надо, просто раздражают ненужные предупреждения, особенно когда их много.


Так совет под #1 самый верный. Зачем писать функцию на Си, если фактически она написана на асме? Ее и надо написать на асме, в асмовском файле, объявить ее глобальной, в каком-нибудь сишном h-файле объявить ее прототип и спокойно вызывать из С без всякой ругани компилятора.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Dot
сообщение Oct 17 2005, 17:04
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 13-10-05
Пользователь №: 9 595



Я еще ни разу так не делал, поэтому ничего сказать не могу. Могу только предположить некоторую муторность такого метода. И ухудшение этой самой "сопровождаемости". Пока я просто смирился.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Oct 18 2005, 03:09
Сообщение #6


Знающий
****

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



Цитата(Dot @ Oct 17 2005, 22:04)
Я еще ни разу так не делал, поэтому ничего сказать не могу. Могу только предположить некоторую муторность такого метода.

в чем муторность?

Цитата
И ухудшение этой самой "сопровождаемости". 

в чем ухудшение?

Цитата
Пока я  просто смирился.
*

ну и зря. В куже никчемных предупреждений легко незаметить критическое.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post

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

 


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


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