;Несколько примеров с использованием косвенной адресации и циклов.
LIST P=18F1320, F=INHX32
#INCLUDE <P18F1320.INC>
CONFIG OSC = INTIO2,FSCM = OFF,PWRT = ON,WDT = OFF
UDATA_ACS
BLOCK1 RES 0x23
BLOCK2 RES 0x23
COUNT RES 1
J RES 1
RESET_VECTOR CODE 0x0000
GOTO MAIN
;------------------------Конструкция "repeat-until"-повторять до тех пор,пока-----------------------------------------------------------------
MAIN: LFSR 0,BLOCK1 ;Загружаем в FSR0 адрес BLOCK1
LFSR 1,BLOCK2 ;Загружаем в FSR1 адрес BLOCK2
MOVLW 0x23
MOVWF J
CLRF COUNT
JLOOP1: MOVFF COUNT,WREG ;COUNT в WREG
MOVWF POSTINC0 ;Копируем из WREG в регистр по адресу,который находится в FSR0,а затем увеличиваем на 1 адрес в FSR0.
INCF COUNT ;Увеличиваем на 1
DECFSZ J ;Отнимаем 1 и пропускаем следующую строку если достигли 0
BRA JLOOP1
MOVLW 0x23
MOVWF J
CLRF COUNT
JLOOP2: MOVFF COUNT,WREG
MOVWF POSTINC1
INCF COUNT
DECFSZ J
BRA JLOOP2
LFSR 0,BLOCK1
LFSR 1,BLOCK2
MOVLW 0x23
MOVWF J
JLOOP3: MOVF POSTINC0,W ;Копируем содержимое регистра по адресу в FSR0 в WREG,увеличиваем на 1 адрес в FSR0
ADDWF POSTINC1 ;Прибавляем содержимое WREG к содержимому регистра по адресу в FSR1,увеличиваем на 1 адрес в FSR1
DECFSZ J
BRA JLOOP3
;----------------Проверяем есть ли в массиве число 0х0D--------------------------------
MOVLW 0x0D
MOVWF 0x03 ;Загрузим по даресу 0х03 для теста число 0х0D
LFSR 0,BLOCK1
MOVLW 0x23
MOVWF J
JLOOP4: MOVLW 0x0D
SUBWF POSTINC0,W
BZ FOUND_IT
DECFSZ J
BRA JLOOP4
NOT_FOUND:
;Код для случая,когда 0x0D не найдено
FOUND_IT:
;Код для случая,кода 0x0D найдено
;--------------Конструкция while-до тех пор,пока число не ноль----------------------------------------
LFSR 0,BLOCK1
MOVLW 0x23
MOVWF J
JLOOP5: DCFSNZ J
BRA NOT
MOVLW 0x0D
SUBWF POSTINC0,W
BNZ JLOOP5
FOUND:
NOT:
NOP
STOP: BRA STOP
END
НАЗАД ДАЛЕЕ