Voloshchenko 0 30 марта, 2006 Опубликовано 30 марта, 2006 · Жалоба Здравствуйте, Знатоки! У С-функции есть прототип: unsigned int Func (unsigned char); Вызываю ее так: unsigned int w=Func(0x01); Описание функции с помощью ASM-вставок выглядит для простоты, например, так: void _Func (void) { #pragma asm ; что-то там делаю MOV A, R7 ; ее входной аргумент в R7, MOV R6, A ;а выходное значение возвращаю в R6,R7 RET #pragma endasm } Вопросы 1. Это сделано в соответствии с http://onembedding.com/hints/hacks/asm-inline/, т.е. в описании перед названием функции Func стоит «_». Но все равно при компиляции выдается «error C231 ‘_Func’ : redefinition ». Почему? 2. Если убрать из описания «_», то вроде компилируется, все равно выдается warning L1 и L2 «». Как быть? 3. Как все же сделать ASM-вставку в С-коды правильно? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
volkanaft 0 31 марта, 2006 Опубликовано 31 марта, 2006 · Жалоба Так объявляете функцию как UIn F(UCh), А в модуле void F(void) ->отсюда возмущение компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bialix 0 3 апреля, 2006 Опубликовано 3 апреля, 2006 · Жалоба Ошибка error C231 ‘_Func’ : redefinition у вас возникает потому, что вы включаете "нормальный" заголовок функции (в котором указаны аргументы) в тот исходный файл, где собственно определено тело самой функции с асм-вставками. Т.е. у вас есть файл заголовков, например foo.h, в котором есть прототип: unsigned int Func (unsigned char); И есть само тело модуля foo.c, в котором вы делаете хак с асм-вставкой. Так вот: включать в модуль foo.c заголовок foo.h ни в коем случае нельзя. Потому что тогда компилятор видит в области видимости одного модуля две функции с одинаковыми именами, но разными сигнатурами (набором входящих и выходящих параметров). Если вы никак не можете уйти от включения foo.h в foo.c, то тут или надо применять условную компиляцию для прототипов функций, либо выделить функцию с асм-вставкой в отдельный файл, например foo_asm.c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Voloshchenko 0 3 апреля, 2006 Опубликовано 3 апреля, 2006 · Жалоба Спасибо за ответ. У меня здесь все в одном файле: и прототип, и вызов функции и ее описание. И.Кант прав, спору нет, но все же такой "хак" с передачей параметов и возвратом значения не проходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bialix 0 3 апреля, 2006 Опубликовано 3 апреля, 2006 · Жалоба У меня здесь все в одном файле: и прототип, и вызов функции и ее описание. Так работать не будет, я же сказал. И.Кант прав, спору нет, но все же такой "хак" с передачей параметов и возвратом значения не проходит. Хаки работают не всегда. Это нужно учитывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krom 0 4 апреля, 2006 Опубликовано 4 апреля, 2006 · Жалоба Ну а почему вообще всю функцию не написать на асм в асм-ом файле? Ну или требуемую часть? и никаких особых заморочек... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Voloshchenko 0 4 апреля, 2006 Опубликовано 4 апреля, 2006 · Жалоба Спасибо, по поводу Asm-функций: видно, так и придется делать - это будет естественней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bialix 0 4 апреля, 2006 Опубликовано 4 апреля, 2006 · Жалоба Ну а почему вообще всю функцию не написать на асм в асм-ом файле? Ну или требуемую часть? и никаких особых заморочек... Это безусловно правильный путь (ТМ). Только заморочки там будут маленькие и свои. Хаки -- это когда хочется по-быстрому. Хаки -- не самоцель, а лишь одна из возможностей достичь цели. :ninja: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться