roboforum.ru

Технический форум по робототехнике.

Команды на ASM в WinAvr

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Команды на ASM в WinAvr

Сообщение blindman » 30 окт 2009, 13:01

Именно обнулить, если меняешь. И - да, при старте там 0.

Вот кусок листинга:
Код: Выделить всёРазвернуть
   a(z1);
  da:   60 91 64 00    lds   r22, 0x0064
  de:   ce 01          movw   r24, r28
  e0:   45 96          adiw   r24, 0x15   ; 21
  e2:   70 e0          ldi   r23, 0x00   ; 0
  e4:   bc df          rcall   .-136       ; 0x5e <a>
   z32+=z1;
  e6:   20 91 64 00    lds   r18, 0x0064
  ea:   80 91 7c 00    lds   r24, 0x007C
  ee:   90 91 7d 00    lds   r25, 0x007D
  f2:   a0 91 7e 00    lds   r26, 0x007E
  f6:   b0 91 7f 00    lds   r27, 0x007F
  fa:   82 0f          add   r24, r18
  fc:   91 1d          adc   r25, r1
  fe:   a1 1d          adc   r26, r1
100:   b1 1d          adc   r27, r1
102:   80 93 7c 00    sts   0x007C, r24
106:   90 93 7d 00    sts   0x007D, r25
10a:   a0 93 7e 00    sts   0x007E, r26
10e:   b0 93 7f 00    sts   0x007F, r27


Если функция a() запишет в R1 что-то отличное от нуля, то z32+=z1 будет неверно вычислено
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Команды на ASM в WinAvr

Сообщение boez » 30 окт 2009, 13:10

Я почему спросил - если именно "восстанавливать", а не "вообще не трогать", то это значит что обработчик прерывания не может полагаться на то что там 0 и должен записывать его туда сам, если вызывает другие функции, так?
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Команды на ASM в WinAvr

Сообщение Drunya » 30 окт 2009, 13:13

Короче, лучше __zero_reg__ не трогать :)
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Команды на ASM в WinAvr

Сообщение blindman » 30 окт 2009, 13:14

А, ну да, про прерываня я забыл. В обработчике прерываний - да, надо сохранять, обнулять, а при выходе восстанавливать.
Вот кусок из мануала соответствующий:
• Fixed registers (r0, r1):
Never allocated by gcc for local data, but often used for fixed purposes:
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 some-
thing for a while within one piece of assembler code, but must then be cleared
after use (clr r1). This includes any use of the [f]mul[s[u]] 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).
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Пред.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23