Помогите разобраться в коде.
Что это означает:
Код: Выделить всё
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
;==============



