Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интерфейс к ассемблерной функции 
:(
    Опции темы
Ivan.
Дата 11.6.2014, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Доброе время суток.
Подскажите, можно ли создать интерфейс к ассемблерной функции, чтобы компилятор (в частности arv-g++) поместил входные параметры в указанные регистры?
что-то вроде:
Код
extern "bla-bla" void Func(register u8 Byte asm("r0"), register u16 &Word asm("r22"));



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
ФедосеевПавел
Дата 11.6.2014, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 1
Всего: 10



Для avr-gcc думаю - нет.
См. AVR-LIBC раздел "What registers are used by the C compiler?"
Цитата

r0 - temporary register, can be clobbered by any C code (except interrupt handlers which save it), may be used to remember something for a while within one piece of assembler code 

r1 - assumed to be always zero in any C code, may be used to remember something for a while within one piece of assembler code, but must then be cleared after use (clr r1). This includes any use of the mul instructions, which return their result in r1:r0. Interrupt handlers save and clear r1 on entry, and restore r1 on exit (in case it was non-zero). 

Function call conventions:
 Arguments - allocated left to right, r25 to r8. All arguments are aligned to start in even-numbered registers (odd-sized arguments, including char, have one free register above them). This allows making better use of the movw instruction on the enhanced core. 

If too many, those that don't fit are passed on the stack. 

Return values: 8-bit in r24 (not r25!), 16-bit in r25:r24, up to 32 bits in r22-r25, up to 64 bits in r18-r25. 8-bit return values are zero/sign-extended to 16 bits by the called function (unsigned char is more efficient than signed char - just clr r25). Arguments to functions with variable argument lists (printf etc.) are all passed on stack, and char is extended to int.

PM   Вверх
Ivan.
Дата 14.6.2014, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



теоретически это возможно, но у меня ни как не получается заставить 1 переменную поместить в конкретный регистр:
Код

inline void Func(u8 Byte, u16 &Word, const u16 &Word2)
{
    register u8 Temp asm("r0") = Byte;
    register u16 &word asm("r22") = Word;
    __asm__ __volatile__ (
        "CALL AsmFunc\n"
        :"+r"(word) :"t"(Temp), "z"(Word2)
    );
}

переменные Byte и Word2 помещяются в 0 и 30-31 регистры соответственно,
а переменная Word ни в какую не хочет помещаться в r22-r23, хотя в GCC-AVR Inline Assembler Cookbook Version 1.6 есть четко описанное правило.
Что я делаю не так?


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
ФедосеевПавел
Дата 14.6.2014, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 1
Всего: 10



Не знаю.

А если asm функцию привести в соответствие с соглашением о передачи параметров?
PM   Вверх
Ivan.
Дата 15.6.2014, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



asm функция - это часть модуля и я не имею возможности вносить в нее изменения


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
ФедосеевПавел
Дата 15.6.2014, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 1
Всего: 10



Жаль.

Сейчас у меня не установлен ни WinAVR ни AVRStudio - проверить не могу.
Пока не подошли более опытные форумчане, могу посоветовать такие варианты:
1) может быть в r22-r23 невозможно одним движением записать 2 байта - а если попробовать отправить значение в r22-r23 через промежуточные регистры r28-r29 (y) или (x).
2) реализовать функцию-обёртку на асме (файл *.S) и в ней уже перераспределять данные по регистрам, вызывать RCALL AsmFunc, перераспределять результат.
3) в тексте программы каждый вызов AsmFunc переписать на встроенном асме (раз уж не получается через inline).

Может быть, есть ещё способы...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0414 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.