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

 
 
 
Reply to this topicStart new topic
> Правильные ASM-вставки для Keil C51, Как они выглядят?
Волощенко
сообщение Mar 30 2006, 13:19
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Здравствуйте, Знатоки!
У С-функции есть прототип: 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-вставку в С-коды правильно? smile.gif
Go to the top of the page
 
+Quote Post
volkanaft
сообщение Mar 31 2006, 08:40
Сообщение #2





Группа: Новичок
Сообщений: 10
Регистрация: 4-02-05
Пользователь №: 2 416



Так объявляете функцию как UIn F(UCh),
А в модуле void F(void)
->отсюда возмущение компилятора.
Go to the top of the page
 
+Quote Post
bialix
сообщение Apr 3 2006, 09:18
Сообщение #3


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

Группа: Свой
Сообщений: 174
Регистрация: 4-11-04
Из: zp.ua
Пользователь №: 1 046



Ошибка error C231 ‘_Func’ : redefinition у вас возникает потому, что вы включаете "нормальный" заголовок функции (в котором указаны аргументы) в тот исходный файл, где собственно определено тело самой функции с асм-вставками.

Т.е. у вас есть файл заголовков, например foo.h, в котором есть прототип:
unsigned int Func (unsigned char);

И есть само тело модуля foo.c, в котором вы делаете хак с асм-вставкой.

Так вот: включать в модуль foo.c заголовок foo.h ни в коем случае нельзя.

Потому что тогда компилятор видит в области видимости одного модуля две функции с одинаковыми именами, но разными сигнатурами (набором входящих и выходящих параметров). Если вы никак не можете уйти от включения foo.h в foo.c, то тут или надо применять условную компиляцию для прототипов функций, либо выделить функцию с асм-вставкой в отдельный файл, например foo_asm.c


--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Apr 3 2006, 13:30
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Спасибо за ответ.
У меня здесь все в одном файле: и прототип, и вызов функции и ее описание.
И.Кант прав, спору нет, но все же такой "хак" с передачей параметов и возвратом значения не проходит.
Go to the top of the page
 
+Quote Post
bialix
сообщение Apr 3 2006, 14:41
Сообщение #5


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

Группа: Свой
Сообщений: 174
Регистрация: 4-11-04
Из: zp.ua
Пользователь №: 1 046



Цитата(Волощенко @ Apr 3 2006, 16:30) *
У меня здесь все в одном файле: и прототип, и вызов функции и ее описание.

Так работать не будет, я же сказал.
Цитата
И.Кант прав, спору нет, но все же такой "хак" с передачей параметов и возвратом значения не проходит.

Хаки работают не всегда. Это нужно учитывать.


--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
Go to the top of the page
 
+Quote Post
Krom
сообщение Apr 4 2006, 05:17
Сообщение #6


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

Группа: Свой
Сообщений: 107
Регистрация: 27-06-05
Из: Россия
Пользователь №: 6 324



Ну а почему вообще всю функцию не написать на асм в асм-ом файле? Ну или требуемую часть? и никаких особых заморочек...
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Apr 4 2006, 05:47
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Спасибо, по поводу Asm-функций: видно, так и придется делать - это будет естественней.
Go to the top of the page
 
+Quote Post
bialix
сообщение Apr 4 2006, 05:48
Сообщение #8


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

Группа: Свой
Сообщений: 174
Регистрация: 4-11-04
Из: zp.ua
Пользователь №: 1 046



Цитата(Krom @ Apr 4 2006, 08:17) *
Ну а почему вообще всю функцию не написать на асм в асм-ом файле? Ну или требуемую часть? и никаких особых заморочек...

Это безусловно правильный путь (ТМ). Только заморочки там будут маленькие и свои.

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

ninja.gif


--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 1st August 2025 - 18:45
Рейтинг@Mail.ru


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