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

Возврат значения в регистре R0

По соглашению, Keil С компилятор возвращает значение функции в R0.

Если я пишу функцию полностью на ассемблере, то такой код

unsigned int my_function(int param1, char param2) __arm 
{
__asm{ 
 ........... 
 MOV  R0,...   //return value in R0 
 }//asm 
}

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

 

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

 

Это просто вопрос перфекциониста.

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


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

Три варианта решения:

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’ом никогда не пользовался), то объявляешь функцию с этим параметром, который подавляет генерацию пролога/эпилога компилятором и тогда все в твоих руках.

 

Успехов

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


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

Спасибо за отклик,

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

 

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

 

MOV R0,... //return value in R0

LDR R1,=result

STR R0,[R1]

}//asm

return (result);

}

 

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

 

По 3 -- есть атрибут __task для объявления функции (использую uVision, компилятор от Keil), который подавляет генерацию пролога-эпилога, вот только функция эта должна быть строго void function(void).

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


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

Спасибо за отклик,

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

 

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

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


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

Я еще ни разу так не делал, поэтому ничего сказать не могу. Могу только предположить некоторую муторность такого метода. И ухудшение этой самой "сопровождаемости". Пока я просто смирился.

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


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

Я еще ни разу так не делал, поэтому ничего сказать не могу. Могу только предположить некоторую муторность такого метода.

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

 

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

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

 

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

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

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


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

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

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

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

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

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

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

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

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

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