MPLab仿真器PIC16汇编程序无限循环-程序未结束

时间:2019-01-31 21:27:06

标签: assembly simulator mplab

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

我不明白为什么在最后三个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 :(得分:0)

我想向您解释有关杰斯特评论的背景:

背景

您应该记住什么是汇编语言以及CPU和内存的工作方式。

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

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

在12位变量上,例如数字451使CPU执行加法运算。

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

问题

  • CPU(通常)不知道某些“ END”指令。相反,CPU将无休止地运行。
  • 您的程序长7条指令;程序存储器中有7个数字。

    但是,PIC微控制器程序存储器的大小远远超过7个字。

    因此,第三条NOP指令后有一些内存。该内存将包含数字,但您不知道它包含哪些数字。

    CPU将加载存储在其中的数字并执行它们。如果数字451存储在此处,则它无法知道这些数字是否有意存储(因为您的程序包含指令ADDWF 3, 0)或数字是否无意存储,因为您的程序比内存短。