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

 
 
 
Reply to this topicStart new topic
> Макрос на C содержит asm., Передача параметра
Alex ma
сообщение Dec 24 2006, 13:27
Сообщение #1


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

Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445



Необходимо загрузить константу в Z регистр и косвенно вызвать подпрограмму.
а – константа.

Сам макрос:
#define IcallFunc(a)\
{\
asm ("LDI r30, Low(a)\n LDI r31, High(a)\n ICALL");\
}\

Применение:
IcallFunc (0х0104); по идеи вызывается подпрограмма по адресу 0х0104.

Пишет:
Error[Og005]: Unknown symbol in inline assembly: "a"

Если объявить переменную а,
unsigned int a; тогда
IcallFunc (0х0104), нормально компилируется, но!

17: IcallFunc (0x0104);
+0000008D: EFE7 LDI R30,0xF7 Load immediate
+0000008E: E0F0 LDI R31,0x00 Load immediate
+0000008F: 9509 ICALL Indirect call to (Z)
В место константы 0х0104, загружает в r30, r31 адрес SRAM где расположена переменная а – 0x00F7 SRAM, значение переменной 0x0000.
Как заставить загружать константу 0х0104 а, не адрес SRAM где расположена переменная , мне не понятно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 24 2006, 14:13
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Alex ma @ Dec 24 2006, 12:27) *
Необходимо загрузить константу в Z регистр и косвенно вызвать подпрограмму.
Для этого не нужен inline-asm
Код
     ((void (*)(void))0x104)();

     25              ((void (*)(void))0x104)();
   \   00000000   E0E4               LDI     R30, 4
   \   00000002   E0F1               LDI     R31, 1
   \   00000004   9509               ICALL
Только не забываем, что у IAR адреса байтовые, а в Z надо грузить адрес слова, т.е. байтовый пополам.
А с параметрами inline-asm не работает. Более того, умный оптимизатор глубоко плюет на asm. Например, такой пример:
Код
static void func(uint8_t param)  // параметр должен передаваться в R16, static чтобы заинлайнить
{
     asm("STS     TestCell, R16");
}  

void main()
{
     func(123);
}
Тут оптимизатор видит, что в func памаметр не используется и в main его просто не загружает в r16 перед асм-вставкой. Они так и пишут в доке - инлайн-асм можно сказать что не получился, на него "забили", поэтому пользуйте либо имеющиеся intrinsic -функции, либо пишите всю функцию на асме и прилинковывайте к проекту.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alex ma
сообщение Dec 24 2006, 18:34
Сообщение #3


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

Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445



Цитата(Сергей Борщ @ Dec 24 2006, 16:13) *
Цитата(Alex ma @ Dec 24 2006, 12:27) *

Необходимо загрузить константу в Z регистр и косвенно вызвать подпрограмму.
Для этого не нужен inline-asm
Код
     ((void (*)(void))0x104)();

     25              ((void (*)(void))0x104)();
   \   00000000   E0E4               LDI     R30, 4
   \   00000002   E0F1               LDI     R31, 1
   \   00000004   9509               ICALL
Только не забываем, что у IAR адреса байтовые, а в Z надо грузить адрес слова, т.е. байтовый пополам.
А с параметрами inline-asm не работает. Более того, умный оптимизатор глубоко плюет на asm. Например, такой пример:
Код
static void func(uint8_t param)  // параметр должен передаваться в R16, static чтобы заинлайнить
{
     asm("STS     TestCell, R16");
}  

void main()
{
     func(123);
}
Тут оптимизатор видит, что в func памаметр не используется и в main его просто не загружает в r16 перед асм-вставкой. Они так и пишут в доке - инлайн-асм можно сказать что не получился, на него "забили", поэтому пользуйте либо имеющиеся intrinsic -функции, либо пишите всю функцию на асме и прилинковывайте к проекту.


Спасибо, на Си лучше. Сам только додумался до asm
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 03:34
Рейтинг@Mail.ru


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