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

 
 
> Как сделать IJMP внутри программы на Си?
hakimulla
сообщение Mar 28 2012, 18:50
Сообщение #1





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



Объясните, пожалуйста, как оформить индексный переход IJMP в программе
на Си.
Можно ли как-нибудь прочитать значение Program Counter (PC) для
AT90USB162?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение Mar 28 2012, 19:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(hakimulla @ Mar 28 2012, 21:50) *
Объясните, пожалуйста, как оформить индексный переход IJMP в программе
на Си.

Зачем именно IJMP?

Цитата(hakimulla @ Mar 28 2012, 21:50) *
Можно ли как-нибудь прочитать значение Program Counter (PC) для
AT90USB162?

Напрямую - нет. И зачем он?
Ненапрямую можно так:
Код
unsigned short GetPC()
{
    unsigned char *ptr=(unsigned char *)SP;
    ptr+=2;
    unsigned short result=*ptr--;
    result+=(*ptr)<<8;
    
    return result;
}
Go to the top of the page
 
+Quote Post
hakimulla
сообщение Mar 29 2012, 06:26
Сообщение #3





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



Цитата(_Артём_ @ Mar 28 2012, 22:27) *
Зачем именно IJMP?
Напрямую - нет. И зачем он?

Спасибо за подсказку, но можно ли это сделать без хитростей со стеком?
Мне нужно поднять производительность. Оптимизирую код ассемблерными
вставками. Прога большая - поэтому она на СИ.
Для выполнения команды IJMP в регистр Z нужно загружать адреса
меток, но как их получить в ассемблерной вставке? На момент компиляции
и линковки эти адреса меток известны. Вопрос в синтаксисе. Как их
задать и как к ним обратиться внутри ассемблерной вставки?


Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 29 2012, 09:20
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(hakimulla @ Mar 29 2012, 05:26) *
Для выполнения команды IJMP в регистр Z нужно загружать адреса
меток, но как их получить в ассемблерной вставке?

Попробуйте вот так
asm volatile ("ldi r30,lo8(pm(desiredLabel))");
asm volatile ("ldi r31,hi8(pm(desiredLabel))");


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- hakimulla   Как сделать IJMP внутри программы на Си?   Mar 28 2012, 18:50
|- - Сергей Борщ   QUOTE (hakimulla @ Mar 29 2012, 09:26) Дл...   Mar 29 2012, 07:06
||- - ReAl   Цитата(Сергей Борщ @ Mar 29 2012, 10:06) ...   Mar 29 2012, 18:49
|- - kolobok0   Цитата(hakimulla @ Mar 29 2012, 10:26) .....   Aug 9 2012, 06:18
- - hd44780   Цитата(hakimulla @ Mar 28 2012, 21:50) Об...   Mar 29 2012, 05:49
- - -SANYCH-   На языке С джампы можно сделать с помощью "go...   Mar 29 2012, 06:19
- - Alex11   Или поставьте параллельно ассемблерные метки: asm(...   Mar 29 2012, 15:23
- - prottoss   Вообще конечно это муть полная. Оптимизировать нуж...   Mar 29 2012, 16:54
- - alexeyv   В стандартной библиотеке Си есть файл setjmp.h, об...   Apr 3 2012, 02:59
- - Navovvol   нужно просто избавиться от злого _delay_ms(...);   Apr 3 2012, 13:00
|- - _Pasha   Цитата(Navovvol @ Apr 3 2012, 16:00) нужн...   Apr 5 2012, 13:40
- - Д_М   Не надо использовать IJMP, так как это грубо и вул...   Aug 8 2012, 19:22
- - ReAl   Цитата(Д_М @ Aug 8 2012, 22:22) Не надо и...   Aug 9 2012, 06:34
- - Maik-vs   Не вижу, чем ijmp отличается от goto? ну хорошо, g...   Aug 10 2012, 04:40
- - kolobok0   Цитата(Maik-vs @ Aug 10 2012, 08:40)...   Aug 10 2012, 06:16


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

 


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


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