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

 
 
> Вопрос по недокументированной команде ATtiny13., Откуда у ATtiny13 команда jmp ?
kv_addr
сообщение Apr 6 2009, 09:06
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Во избежание открытия в ветке дискуссии по поводу, кошерно ли рестартовать не через watchdog, а переходом по адресу 0, хотел бы заметить, в моём конкретном случае - вполне кошерно. Рестарт происходит по нажатию и отпусканию кнопки путем вывода контроллера из режима глубокой спячки, все необходимое подготовлено перед вводом в спячку.

Перейду к сути. Имеем предельно простую подпрограмму прерывания:
Код
#pragma vector= INT0_vect
__interrupt void Int0(void)
{
  while(!BUTTON);
  __indirect_jump_to(0);
}

Генерируется код:
Код
     18          __interrupt void Int0(void)
   \                     Int0:
     19          {
   \   00000000   93FA               ST      -Y, R31
   \   00000002   93EA               ST      -Y, R30
     20            while(!BUTTON);
   \                     ??Int0_0:
   \   00000004   9BB1               SBIS    0x16, 0x01
   \   00000006   CFFE               RJMP    ??Int0_0
     21            __indirect_jump_to(0);
   \   00000008   E0E0               LDI     R30, 0
   \   0000000A   E0F0               LDI     R31, 0
   \   0000000C   9409               IJMP
   \   0000000E                      REQUIRE _A_PINB
     22          }

Все выполняется верно (и в железе тоже). Пишу с ассемблерной вставкой:
Код
#pragma vector= INT0_vect //В выключеном состоянии ~1...1,5 мкА
__interrupt void Int0(void)
{
  while(!BUTTON);
  asm("jmp 0"); // Не "rjmp 0", а именно "jmp 0" !
}

Генерируется код:
Код
     18          __interrupt void Int0(void)
   \                     Int0:
   \                     ??Int0_0:
     19          {
     20            while(!BUTTON);
   \   00000000   9BB1               SBIS    0x16, 0x01
   \   00000002   CFFE               RJMP    ??Int0_0
     21            asm("jmp 0");
   \   00000004   940C0000           jmp 0
     22          }

И, как ни странно, все выполняется (и в железе тоже).

В таком случае возникает вопрос, откуда у ATtiny13 появилась выполняемая в реале команда "jmp", отсутствующая в наборе команд для этого конкретного контроллера?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Apr 6 2009, 10:41
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(kv_addr @ Apr 6 2009, 12:06) *
В таком случае возникает вопрос, откуда у ATtiny13 появилась выполняемая в реале команда "jmp", отсутствующая в наборе команд для этого конкретного контроллера?

Возникает также и другой вопрос:
Если поставить
asm("jmp random")
что-нибудь изменится?

Или МК будет тоже резетиться.
Go to the top of the page
 
+Quote Post
kv_addr
сообщение Apr 6 2009, 11:25
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Цитата(defunct @ Apr 6 2009, 13:41) *
Возникает также и другой вопрос:
Если поставить
asm("jmp random")
что-нибудь изменится?

Или МК будет тоже резетиться.


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

PS: Но вопрос о недокументированной команде остался в силе.

PPS: Кстати, в своё время знал о недокументированных командах Z80 и иногда использовал их для трюков. wink.gif
Go to the top of the page
 
+Quote Post



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

 


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


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