Dot 0 14 октября, 2005 Опубликовано 14 октября, 2005 · Жалоба По соглашению, Keil С компилятор возвращает значение функции в R0. Если я пишу функцию полностью на ассемблере, то такой код unsigned int my_function(int param1, char param2) __arm { __asm{ ........... MOV R0,... //return value in R0 }//asm } приводит к генерации компилятором предупреждения "no return value". Есть ли способ сказать компилятору, что я действительно возвращаю значение в R0? Это просто вопрос перфекциониста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 15 октября, 2005 Опубликовано 15 октября, 2005 · Жалоба Три варианта решения: 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’ом никогда не пользовался), то объявляешь функцию с этим параметром, который подавляет генерацию пролога/эпилога компилятором и тогда все в твоих руках. Успехов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dot 0 15 октября, 2005 Опубликовано 15 октября, 2005 · Жалоба Спасибо за отклик, еще раз подчеркну, что все и так работает как надо, просто раздражают ненужные предупреждения, особенно когда их много. По 2-- все так, только концовка пишется иначе: MOV R0,... //return value in R0 LDR R1,=result STR R0,[R1] }//asm return (result); } что приводит к генерации кучи ненужного кода ("из пустого в порожнее"). По 3 -- есть атрибут __task для объявления функции (использую uVision, компилятор от Keil), который подавляет генерацию пролога-эпилога, вот только функция эта должна быть строго void function(void). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_Mozzhevilov 0 17 октября, 2005 Опубликовано 17 октября, 2005 · Жалоба Спасибо за отклик, еще раз подчеркну, что все и так работает как надо, просто раздражают ненужные предупреждения, особенно когда их много. Так совет под #1 самый верный. Зачем писать функцию на Си, если фактически она написана на асме? Ее и надо написать на асме, в асмовском файле, объявить ее глобальной, в каком-нибудь сишном h-файле объявить ее прототип и спокойно вызывать из С без всякой ругани компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dot 0 17 октября, 2005 Опубликовано 17 октября, 2005 · Жалоба Я еще ни разу так не делал, поэтому ничего сказать не могу. Могу только предположить некоторую муторность такого метода. И ухудшение этой самой "сопровождаемости". Пока я просто смирился. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_Mozzhevilov 0 18 октября, 2005 Опубликовано 18 октября, 2005 · Жалоба Я еще ни разу так не делал, поэтому ничего сказать не могу. Могу только предположить некоторую муторность такого метода. в чем муторность? И ухудшение этой самой "сопровождаемости". в чем ухудшение? Пока я просто смирился. <{POST_SNAPBACK}> ну и зря. В куже никчемных предупреждений легко незаметить критическое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться