Здравствуйте! Помогите разобраться в коде. Что это означает:
Код:
subi Tmp1,Low(1)
А потом следует
Код:
sbci Tmp1,High(1)
Как у единицы может быть старшая и младшая тетрады? Ведь low(metka) или high(metka) означает обращение к младшему и старшему байту метки metka. А low(1) или high(1) мои мо́зги обнуляют... Объясните пожалуйста!
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 ; послать в системную очередь задач
Спасибо. Вроде начинает доходить... Т.е. единица рассматривается как двухбайтная. В старшем байте 0b0000 0000, а в младшем 0b0000 0001 Выражение subi Tmp1,low(1) уменьшает значение в Tmp1 на единицу. А выражение sbci Tmp1, high(1) означает, что от Tmp1 ничего не отнимается?
Только у АВРок для случаев двухбайтовой математики еще SBIW/ADIW имеются (диапазон константы 0-63). Зачем дополнительный осложнямс? Разве что для экономии регистров...
Ну дык... справедливо, ежли диапазон константы вычитания/сложения БОЛЕЕ 0-63 или оба числа есть содержимое регистров... если необходимость сложения /вычитания двухбайтового числа с константой, определенной в пределах 0-63 (стандартные инкремент/декремент указателя адреса и/или 16-разрядного счетчика или чего подобного) удобнее использовать в регистровой паре (любая из R25:R24, R27:R26, R29:R28, R30:R29) накопитель и команды SBIW rp,n ADIW rp,n... тем более, что исключается контроль промежуточного переполнения, а условия по флагам (С и/или Z) соответствуют результату для 16-разрядного значения...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения