Easyelectronics.ru

Электроника для всех
Текущее время: 12 ноя 2018, 23:39

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 89 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 24 май 2017, 14:25 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
casus писал(а):
Bill писал(а):
При прерываниях автоматически сохраняются в стеке все регистры процессора, в том числе и регистр состояния

Вопрос: нафига козе баян: операторы pop, popw и push, pushw? Какое их практическое применение, если всё автоматизированно?

:) Ну, например
Код:
memcpy:
      pushw   y          ; Save destination memory pointer
      push    a          ; Save byte counter on stack
loop: ld      a, (x)     ; Copy a byte from source
      incw    x                ;
      ld      (y), a     ; to destination
      incw    y                ;
      dec    (0, sp)     ; Bump byte counter
      jrne   loop        ; Loop if not done yet

      pop    a           ; Stack balance
      popw   x           ; Return destination pointer in X
      ret


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 25 май 2017, 00:46 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
кажется я начинаю понимать за что асм не любят.. положить в Y, а изъять в X?
это преднамеренное вермишеливание кода с целью аннигилировать дизассемблирующего, после просмотра кода я будто на ноль поделил

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 25 май 2017, 08:56 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
casus писал(а):
кажется я начинаю понимать за что асм не любят.. положить в Y, а изъять в X?
это преднамеренное вермишеливание кода с целью аннигилировать дизассемблирующего, после просмотра кода я будто на ноль поделил
Это просто соглашение, принятое в компиляторе IAR:
Цитата:
Return values Passed in registers
8-bit scalar values A
16-bit scalar values X
24-bit scalar values ?e0
32-bit scalar or floating-point values ?l0

Прототип функции для данного примера будет выглядеть так:
Код:
char *memcpy(char *src, char *dst, char nbytes);

Обращение к функции:
Код:
   memcpy(a1, a2, 10);
При этом сгенерируется код
Код:
    LD        A, #0xa
    LDW       Y, #a2
    LDW       X, #a1
    CALL      L:memcpy
Та же самая функция на Си
Код:
char *memcpy(char *src, char *dst, char nbytes)
   {
   char   *tmp = dst;   // Save dst pointer to return

   do   {
      *dst++ = *src++;
      }
   while (--nbytes);
   return tmp;
   }
Результат трансляции
Код:
      1          char *memcpy(char *src, char *dst, char nbytes)
      2             {
   \                     memcpy:
   \   000000 B7 ..        LD        S:?b2, A
      3             char   *tmp = dst;   // Save dst pointer to return
   \   000002 90BF ..      LDW       S:?w0, Y
      4         
      5             do   {
      6                *dst++ = *src++;
   \                     ??memcpy_0:
   \   000005 F6           LD        A, (X)
   \   000006 90F7         LD        (Y), A
   \   000008 5C           INCW      X
   \   000009 905C         INCW      Y
      7                }
      8             while (--nbytes);
   \   00000B B6 ..        LD        A, S:?b2
   \   00000D 4A           DEC       A
   \   00000E B7 ..        LD        S:?b2, A
   \   000010 26 F3        JRNE      L:??memcpy_0
      9             return tmp;
   \   000012 BE ..        LDW       X, S:?w0
   \   000014 81           RET
     10             }
Вся разница состоит лишь в том, что я воспользовался стеком, а IAR использовал переменные в памяти. Можете сравнить эффективность программ на ассемблере и на Си, если, конечно, есть желание. Или нет?
PS: Между прочим, "вермишеливания" можно избежать, если изменить порядок следования аргументов. И наконец, результат компиляции мог бы быть чуточку оптимальнее (выполнение цикла). Надеюсь, в будущем разработчики компилятора это сделают.


Последний раз редактировалось Bill 25 май 2017, 10:48, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 25 май 2017, 10:44 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
разница очевидна. но всёравно дичь. копирование с места на место делал за 7 строк без стека.
4 строки эти
LD A, (X)
LD (Y), A
INCW X
INCW Y
и сравнение с количеством байт и переход при неравенстве с инкрементом

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

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 07 сен 2017, 11:55 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
Подскажите как в пару строк устанавливать/снимать бит портов исходя из значения в памяти?
К примеру хочу сделать бегущий огонек. Имею лампочки на портах D2, D3, C6, C7 и переменную в памяти Stat со значениями 0..3
Stat меняет значения и нужно зажигать соответствующую лампочку.
Некрасивый код получается если делать сравнение и каждую включать и выключать.
Нужно компактно и красиво.

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 07 сен 2017, 15:42 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
casus писал(а):
Подскажите как в пару строк устанавливать/снимать бит портов исходя из значения в памяти?
К примеру хочу сделать бегущий огонек. Имею лампочки на портах D2, D3, C6, C7 и переменную в памяти Stat со значениями 0..3
Stat меняет значения и нужно зажигать соответствующую лампочку.
Некрасивый код получается если делать сравнение и каждую включать и выключать.
Нужно компактно и красиво.

Код:
       ld    a, Stat
       rrc   a
       bccm  PD_ODR, #2
       rrc   a
       bccm  PD_ODR, #3
       rrc   a
       bccm  PC_ODR, #6
       rrc   a
       bccm  PC_ODR, #7


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 07 сен 2017, 18:18 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
Спасибо, то что надо
Сам не догадался аккумулятору вращение придать..
Вот что заметил, прерывания надо на время выключать, иначе флаг переноса может из прерывания прийти
Код:
SetULN2003
   ld    a, Stat
   sim
   rrc   a
   bccm  PD_ODR, #3
   rrc   a
   bccm  PD_ODR, #2
   rrc   a
   bccm  PC_ODR, #7
   rrc   a
   bccm  PC_ODR, #6
   rim
   ret


Вообщем появилась противоположная задача, но аналогично её не решить:
считать информацию из хаотично разбросанных портов и записать в переменную Stat
Пока решил задачу логикой and/or и сдвигами. Но вышло строк двадцать..
Может есть мысли и по этому поводу?

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 09 сен 2017, 17:24 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
Еще вопрос, как скопировать бит из памяти в память?

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 09 сен 2017, 18:17 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5124
casus, читаю мануалы вслух, дорого ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 09 сен 2017, 19:03 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
dosikus_2 писал(а):
casus, читаю мануалы вслух, дорого ...

ASSEMBLER programming manual прочитал от и до
нужной инструкции не существует, поэтому и спрашиваю как народ это делает.

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 09 сен 2017, 23:14 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
casus писал(а):
.
Вот что заметил, прерывания надо на время выключать, иначе флаг переноса может из прерывания прийти

Вообщем появилась противоположная задача, но аналогично её не решить:
считать информацию из хаотично разбросанных портов и записать в переменную Stat
Пока решил задачу логикой and/or и сдвигами. Но вышло строк двадцать..
Может есть мысли и по этому поводу?

Прерывания выключать нет необходимости, поскольку при прерываниях гарантируется сохранение всех регистров, и регистра состоянич в том числе.
Код:
     btjf   PD_IDR, #3, ?1
?1:  rlc    a
     btjf   PD_IDR, #5, ?2
?2:  rlc    a
     btjf   PC_IDR, #1, ?3
?3:  rlc    a
     and    a, #7
     ld     Stat, a


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 09 сен 2017, 23:19 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 616
Откуда: Челябинск
casus писал(а):
Еще вопрос, как скопировать бит из памяти в память?

Код:
    btjf  Mem1, #3, ?1
?1: bccm  Mem2, #5


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 09 сен 2017, 23:32 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
Спасибо огромное. Эти трюки сокращают код раза в три - четыре

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ассемблер STM8
СообщениеДобавлено: 08 май 2018, 19:18 
Старожил

Зарегистрирован: 23 дек 2012, 16:46
Сообщения: 310
Откуда: Новый Уренгой
Всем добра.
Пробую полностью избавиться от магических чисел и вместо, например,
bset CLK_SWCR, #1 записывать bset CLK_SWCR, SWEN
но я немогу нигде найти файл в котором объявлено что SWEN = #1.
СИ компилятор откуда-то же это знает..

А хочу писать по аналогии
while(CLK_ECKR_bit.HSERDY != 1) {} //Ждем готовности источника тактирования
не менее красивый код, к примеру такой:
btjf CLK_ECKR, HSERDY, * ; Ждем готовности источника тактирования


UPD:
сгенерил из какого-то хедера, вообщем буду проверять на соответствие
Show

_________________
vk.com/casusnur


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 89 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 5 часов


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB