MPLab 模拟器 PIC16 汇编程序无限循环 - 程序没有结束

MPLab simulator PIC16 assembler infinite loop - program doesn't END

这是一个在 MPLAB 中用 PIC16 的 SIMULATOR 执行的汇编小程序。

我不明白为什么在最后三个 NOP 的最后一个 NOP 之后程序 return 到那组 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

我想向您解释一下 Jester 评论的背景:

背景

您应该牢记什么是汇编语言以及 CPU 和存储器的工作原理。

对于 PIC16 器件,程序存储器以 12 位或 14 位单元组织。这意味着内存可以存储值在 0-4095 或 0-16383 范围内的数字。

程序执行时,CPU会从内存中读取数字,并根据从内存中读取的数字执行一些操作。

在 12 位变体上,例如数字 451 会导致 CPU 执行加法。

汇编程序是一种特殊的编程语言,其中每条指令(通常)恰好对应于内存中的一个数字。例如指令ADDWF 3, 0对应内存中的数字451。

问题

  • A CPU(通常)不知道某些 "END" 指令。相反,CPU 将无休止地 运行。
  • 你的程序有 7 条指令;这是程序内存中的 7 个数字。

    然而,PIC单片机的程序存储器的大小远远超过7个字。

    因此在第 3 个 NOP 指令之后有一些内存。此内存将包含数字,但您不知道它包含哪些数字。

    CPU 将加载存储在那里的数字并执行它们。如果数字451存储在那里,它不知道这些数字是有意存储的(因为你的程序包含指令ADDWF 3, 0)还是无意存储的数字,因为你的程序比内存短。