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

 
 
> Странное поведение JMP
Student2
сообщение Oct 30 2009, 12:53
Сообщение #1


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Мне надо было сделать JMP к адресу 0200. Код такой:


Код
/*---------------------------------------------------------------------------*/
__C_task void main(void)  /* the main code is here */
/*---------------------------------------------------------------------------*/
{
  Initialize();

  
  if (testCode == 0)  /* bad code */
  {
   ((void (*)())0x200)();     /* jump to the fixed address (!!!! USES ICALL!!!!)*/
  }


  if (busReceiveByte() == seq1)
  {

    if (busReceiveByte() == seq2)
    {
      loader();
    }
  }


  ((void (*)())0x200)();  /*(!!!! USES IJMP!!!!) */
  


}


Но на дизассемблере находил что первый JMP \"сделан\" из ICALL а второй из IJMP, что то вроде:

Код
LDI R30, 0x00
LDI R31, 0x02
ICALL


LDI R30, 0x00
LDI R31, 0x02
IJMP


Мне хотелось как нибудь чтобы компилятор поставил RJMP и не мучил меня с IJMP. Конечно я совсем не согласен когда он огорчил меня с ICALL. Слово goto точно подходить для меня но как установить этикет по адресу 0x200?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SysRq
сообщение Oct 30 2009, 20:28
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Если пишу (WinAVR):
Код
__attribute__((noreturn)) void testing_workmode(void)
{
}
То вызов транслируется в:
Код
rcall    .-1268  ; 0x130a4 <testing_workmode>

Где я ошибаюсь, почему тоже call? unsure.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 30 2009, 20:36
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Потому что (имхо) noreturn влияет на формирование пролога и эпилога функции (убирает сохранение используемых регистров), и не влияет на способ вызова этой функции. Она может быть вообще в другом модуле, и вызывающая функция понятия не имеет, что вызываемая - noreturn.
Для проверки напишите
Код
__attribute__((noreturn)) void f2(void)
{
    for (;;);
}
__attribute__((noreturn)) void f1(void)
{
     f2();
}

И получите warning на f1, что типа noreturn-функция похоже делает return.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Student2
сообщение Nov 3 2009, 09:43
Сообщение #4


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Программа сейчас работает, но возникла вот такая проблема поддержки и структурной чистотой - адрес установлен в линкере и он не виден из компилятора. Если хочу использовать то же значение 0200 для установки других параметров мне надо заново установит в файле параметр (например #define SIZE_AREA 0x200). Поддержка кода усложнена и возможность сделать ошибки больше потому что надо менять данные на 2 места .

Я попробовал
Код
#define SIZE_AREA   0x200
.....
((void (*)())SIZE_AREA)();


Все работает прекрасно но нахожу в дизассемблере

Код
LDI  R30, 00
LDI R31, 02
IJMP

В итоге 4 байта больше!

Подскажите как вернут добрый RJMP на месте и вместе с тем установить адрес SIZE_AREA внутри С файла - т.е. был доступен внутри С файла для дополнительные операции как
__root __flash uint16_t MARKER @ (SIZE_AREA-2) = 0x434C;
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Student2   Странное поведение JMP   Oct 30 2009, 12:53
- - Student2   Мне надо было сделать JMP к адресу 0200. Код такой...   Oct 30 2009, 13:00
|- - Сергей Борщ   Кодextern void Application(); __C_task voi...   Oct 30 2009, 14:17
|- - Student2   Цитата(Сергей Борщ @ Oct 30 2009, 16:17) ...   Oct 30 2009, 14:45
|- - demiurg_spb   Цитата(Сергей Борщ @ Oct 30 2009, 17:17) ...   Oct 30 2009, 16:32
|- - aaarrr   Цитата(demiurg_spb @ Oct 30 2009, 19:32) ...   Oct 30 2009, 16:44
|- - Сергей Борщ   Цитата(demiurg_spb @ Oct 30 2009, 19:32) ...   Oct 30 2009, 17:30
|- - demiurg_spb   Цитата(Сергей Борщ @ Oct 30 2009, 20:30) ...   Oct 30 2009, 20:15
- - =GM=   Может так? GOTO desiredAddress; и сишный эквивал...   Oct 30 2009, 13:10
- - rezident   Student2, если вы изобретаете бутлоадер с проверко...   Oct 30 2009, 14:23
|- - Сергей Борщ   Цитата(Student2 @ Nov 3 2009, 12:43) Прог...   Nov 3 2009, 11:38
- - defunct   Цитата(Student2 @ Oct 30 2009, 14:53) Мне...   Nov 4 2009, 00:10


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 00:45
Рейтинг@Mail.ru


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