Организации работы циклов
Организация цикличности программы может быть осуществлено при помощи команд условного перехода. Однако есть встроенные функциональные возможности в виде команды 'DJNZ LC[n], src', позволяющей сформировать более компактную процедуру цикла при помощи кольцевого счетчика. Для хранения содержимого этого кольцевого регистра используются 16- разрядные регистры LC[0] и LC[1]. Команда 'DJNZ LC[n], src' автоматически уменьшает содержимое регистра цикла и при достижении нулевого значения этого регистра переходит по адресу, указанному в регистре источнике.
Чтобы инициализировать цикл, установите в регистре LC[n] необходимое значение.
Необходимое значение должно содержаться в операнде src команды 'DJNZ LC[n], src'. Когда в команду 'DJNZ LC[n]', как это обычно бывает, будет передано относительное значение, ассемблер автоматически вычисляет смещение относительного значения и вставляет это непосредственное значение в объектный код.
move LC[1], #10h ; 16 циклов
LoopTop: ; относительный адрес для djnz LC[n],src
call LoopSub
djnz LC[1], LoopTop ; декремент LC[1] и переход если не нулевое значение
|
Если адрес цикла находится вне диапазона перехода, то для задания старшего байта адреса используется префиксный регистр смещения PFX [0].
move LC[1], #10h ; 16 циклов
LoopTop: ; не относительный адрес для djnz LC[n],src
call LoopSub
...
djnz LC[1], LoopTop ; декремент LC[1] и переход если не нулевое значение
; транслируется в команды: move PFX[0], #high(LoopTop)
; djnz LC[1], #low(LoopTop)
|
Если быстродействие работы кольцевого регистра является критическим параметром и относительный переход не может быть использован, то можно осуществить предварительную загрузку регистра циклов. Это позволит исключить необходимость загружать регистр цикла перед самим циклом и позволит обеспечить максимальное быстродействие команды DJNZ.
move LC[0], #LoopTop ; использование LC[0] в качестве регистра хранения адреса
; транслируется в команды: move PFX[0], #high(LoopTop)
; move LC[0], #low(LoopTop)
move LC[1], #10h ; 16 циклов
...
LoopTop: ; не относительный адрес для djnz LC[n],src
call LoopSub
...
djnz LC[1], LC[0] ; декремент LC[1] и переход если не нулевое значение
|
В режиме предварительной загрузки адреса загрузка должна быть осуществлена до начала цикла:
move LC[1], #10h ; запись в счетчик цикла значения, равного 16
move LC[0], IP ; установка адреса цикла на следующий адрес
LoopTop: ; не относительный адрес для djnz LC[n],src
...
|
|