MPLab симулятор PIC16 ассемблер бесконечный цикл - программа не заканчивается - PullRequest
0 голосов
/ 01 февраля 2019

Это небольшая программа на ассемблере, выполняемая в MPLAB с SIMULATOR для PIC16.

Я не понимаю, почему после последнего NOP из последних трех NOP программа возвращается к первому из этой группы NOP,На мой взгляд, после трех NOP программа завершается, и на самом деле есть оператор END.

;MAIN
 MAIN:
    CALL INITALL

    ciclo:
    CALL COPYcurrentSFRincurrentGPR

    CALL IncrementFSRPOINTER
    CALL IncrementGPRPOINTER

    ;DECFSZ COUNTER,1    ;se counter==0 allora salta l'istruzione successiva
    ;    GOTO ciclo     ;dato che il decremento lo fa prima della verifica della condizione di 0 
    NOP
    NOP
    NOP

    ;GOTO endprogram        ;allora mettendo il counter a 0xB (12) farà 11 cicli, che volendo saltare il registro
                ;INDF (0x00) mi va bene
;endprogram:
;fine del programma
END

1 Ответ

0 голосов
/ 01 февраля 2019

Я хотел бы объяснить вам историю о комментарии Шута:

Фон

Вы должны иметь в виду, что такое язык Ассемблера и как процессор ипамять работает.

В случае устройств PIC16 память программ организована в 12- или 14-битных единицах.Это означает, что в памяти могут храниться числа со значениями в диапазоне 0-4095 или 0-16383.

Когда программа выполняется, ЦПУ будет считывать числа из памяти и выполнять некоторые действия в зависимости от числа.чтение из памяти.

В 12-разрядном варианте число 451, например, заставляет ЦП выполнять сложение.

Ассемблер - это некоторый специальный язык программирования, где каждая инструкция (обычно)соответствует ровно одному числу в памяти.Инструкция ADDWF 3, 0, например, соответствует номеру 451 в памяти.

Проблемы

  • ЦП (обычно) не знает некоторого "КОНЦА"инструкция.Вместо этого процессор будет работать бесконечно.
  • Ваша программа состоит из 7 инструкций;это 7 цифр в памяти программ.

    Однако размер памяти программ микроконтроллера PIC намного превышает 7 слов.

    Поэтому после 3-го * 1030 остается некоторая память* инструкция.Эта память будет содержать числа, но вы не знаете, какие числа она содержит.

    ЦП загрузит хранящиеся там числа и выполнит их.Если там хранится число 451, он не может знать, намеренно ли эти числа существуют (потому что ваша программа содержит инструкцию ADDWF 3, 0) или же число хранится непреднамеренно, потому что ваша программа короче памяти.

...