【问题标题】:MPLab simulator PIC16 assembler infinite loop - program doesn't ENDMPLab 模拟器 PIC16 汇编程序无限循环 - 程序没有结束
【发布时间】:2019-06-25 10:32:56
【问题描述】:

这是一个在 MPLAB 中使用 SIMULATOR for 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

【问题讨论】:

  • 在你的代码之后内存中肯定有一些东西,不管是什么东西都必须让它循环。分解内存内容以查看它是什么和/或模拟器中的单个步骤。

标签: assembly simulator mplab


【解决方案1】:

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

背景

您应该记住什么是汇编语言以及 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)还是因为您的程序比内存短而无意存储了数字。

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    相关资源
    最近更新 更多