Например TDA7294

Форум РадиоКот • Просмотр темы - Непонятный код subi r17,high(1)
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс июл 27, 2025 21:31:47

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


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Непонятный код subi r17,high(1)
СообщениеДобавлено: Пн дек 25, 2017 22:36:20 
Родился

Зарегистрирован: Пн дек 25, 2017 22:14:45
Сообщений: 7
Рейтинг сообщения: 0
Здравствуйте!
Помогите разобраться в коде.
Что это означает:
Код:
subi    Tmp1,Low(1)

А потом следует
Код:
sbci    Tmp1,High(1)


Как у единицы может быть старшая и младшая тетрады?
Ведь low(metka) или high(metka) означает обращение к младшему и старшему байту метки metka.
А low(1) или high(1) мои мо́зги обнуляют...
Объясните пожалуйста!

Код взят из статьи об операционной системе для avr. Вот источник http://easyelectronics.ru/avr-uchebnyj- ... ment-41895

Вот весь макрос с этим кодом:
Код:
.MACRO TimerService
               push    Tmp1
         in       Tmp1,SREG         ; Save Sreg
         push    Tmp1            ; Сохранение регистра Tmp1 и регистра состояния SREG

         push    ZL   
         push    ZH               ; сохранение Регистра Z
         push    Counter            ; сохранение Регистра Counter
   
         ldi    ZL,low(TimersPool)   ; Загрузка с регистр Z адреса RAM,
         ldi    ZH,high(TimersPool); по которому находится информация о таймерах

         ldi    Counter,TimersPoolSize ; максимальное количество таймеров
   
Comp1L01:   ld       Tmp1,Z            ; Tmp1 = [Z] ; Получить номер события
         cpi    Tmp1,$FF         ; Проверить на "NOP"
         breq    Comp1L03         ; Если NOP то переход к следующей позиции

         clt                     ; Флаг T используется для сохранения информации об окончании счёта
         ldd    Tmp1,Z+1         ;
         subi    Tmp1,Low(1)       ; Уменьшение младшей части счётчика на 1
         std    Z+1,Tmp1         ;
         breq    Comp1L02         ; Если 0 то флаг T не устанавливаем
         set                     ;

Comp1L02:   ldd    Tmp1,Z+2         ;
         sbci    Tmp1,High(1)       ; Уменьшение старшей части счётчика на 1
         std    Z+2,Tmp1         ;
         brne    Comp1L03         ; Счёт не окончен
         brts    Comp1L03         ; Счёт не окончен (по T)   
   
         ld       Tmp1,Z            ; Получить номер события
         rcall    SendTask         ; послать в системную очередь задач
   
         ldi    Tmp1,$FF         ; = NOP (задача выполнена, таймер самоудаляется)
         st       Z, Tmp1            ; Clear Event

Comp1L03:   subi    ZL,Low(-3)         ; Skip Counter
         sbci    ZH,High(-3)         ; Z+=3 - переход к следующему таймеру
         dec    Counter            ; счетчик таймеров
         brne    Comp1L01         ; Loop   

         pop    Counter            ; восстанавливаем переменные
         pop    ZH
         pop    ZL

         pop    Tmp1            ; Восстанавливаем регистры
         out    SREG,Tmp1         ;
         pop    Tmp1
         .ENDM

;==============


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятный код subi r17,high(1)
СообщениеДобавлено: Пн дек 25, 2017 22:53:18 
Грызет канифоль

Карма: 13
Рейтинг сообщений: 86
Зарегистрирован: Чт ноя 06, 2014 13:09:06
Сообщений: 278
Рейтинг сообщения: 0
Как у единицы может быть старшая и младшая тетрады?

не тетрады, а байты. Старший и младший байт. Почему не может быть старшего байта? Вас смущает, что старший байт нулевой?

Мне непонятно, что же Вам непонятно :-)

Low(1) = 1
High(1) = 0

====
Low(256) = 0
High(256) = 1


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятный код subi r17,high(1)
СообщениеДобавлено: Пн дек 25, 2017 23:12:39 
Родился

Зарегистрирован: Пн дек 25, 2017 22:14:45
Сообщений: 7
Рейтинг сообщения: 0
Спасибо. Вроде начинает доходить...
Т.е. единица рассматривается как двухбайтная. В старшем байте 0b0000 0000, а в младшем 0b0000 0001
Выражение subi Tmp1,low(1) уменьшает значение в Tmp1 на единицу.
А выражение sbci Tmp1, high(1) означает, что от Tmp1 ничего не отнимается?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятный код subi r17,high(1)
СообщениеДобавлено: Пн дек 25, 2017 23:16:48 
Грызет канифоль

Карма: 13
Рейтинг сообщений: 86
Зарегистрирован: Чт ноя 06, 2014 13:09:06
Сообщений: 278
Рейтинг сообщения: 0
А выражение sbci Tmp1, high(1) означает, что от Tmp1 ничего не отнимается?


Как это ничего? есть еще флаг переноса (который был сброшен/установлен предидущей командой)!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятный код subi r17,high(1)
СообщениеДобавлено: Вт дек 26, 2017 10:03:29 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15108
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Только у АВРок для случаев двухбайтовой математики еще SBIW/ADIW имеются (диапазон константы 0-63).
Зачем дополнительный осложнямс? Разве что для экономии регистров...
:dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Непонятный код subi r17,high(1)
СообщениеДобавлено: Вт дек 26, 2017 17:32:48 
Это не хвост, это антенна
Аватар пользователя

Карма: 6
Рейтинг сообщений: 43
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Сообщений: 1314
Откуда: Казань
Рейтинг сообщения: 0
Изображение


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Непонятный код subi r17,high(1)
СообщениеДобавлено: Ср дек 27, 2017 10:15:01 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15108
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Ну дык...
справедливо, ежли диапазон константы вычитания/сложения БОЛЕЕ 0-63 или оба числа есть содержимое регистров...
если необходимость сложения /вычитания двухбайтового числа с константой, определенной в пределах 0-63
(стандартные инкремент/декремент указателя адреса и/или 16-разрядного счетчика или чего подобного) удобнее использовать
в регистровой паре (любая из R25:R24, R27:R26, R29:R28, R30:R29) накопитель и команды SBIW rp,n ADIW rp,n...
тем более, что исключается контроль промежуточного переполнения, а условия по флагам (С и/или Z) соответствуют результату для 16-разрядного значения...
:roll:


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


Кто сейчас на форуме

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


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

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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y