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

Правильные ASM-вставки для Keil C51

Здравствуйте, Знатоки!

У С-функции есть прототип: 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-вставку в С-коды правильно? :)

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


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

Так объявляете функцию как UIn F(UCh),

А в модуле void F(void)

->отсюда возмущение компилятора.

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


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

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

 

Т.е. у вас есть файл заголовков, например foo.h, в котором есть прототип:

unsigned int Func (unsigned char);

 

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

 

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

 

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

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


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

Спасибо за ответ.

У меня здесь все в одном файле: и прототип, и вызов функции и ее описание.

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

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


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

У меня здесь все в одном файле: и прототип, и вызов функции и ее описание.

Так работать не будет, я же сказал.

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

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

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


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

Ну а почему вообще всю функцию не написать на асм в асм-ом файле? Ну или требуемую часть? и никаких особых заморочек...

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


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

Спасибо, по поводу Asm-функций: видно, так и придется делать - это будет естественней.

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


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

Ну а почему вообще всю функцию не написать на асм в асм-ом файле? Ну или требуемую часть? и никаких особых заморочек...

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

 

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

 

:ninja:

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


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

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

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

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

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

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

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

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

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

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