Пятница, Ноябрь 27, 2020

Косвенная адресация(указатели) PIC18 ASM

;Несколько примеров с использованием косвенной адресации и циклов.               
               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, ;Копируем содержимое регистра по адресу в 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



НАЗАД                                                                                                                                         ДАЛЕЕ


Back to Top