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
)还是无意存储的数字,因为你的程序比内存短。
这是一个在 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
)还是无意存储的数字,因为你的程序比内存短。