这是在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
答案 0 :(得分:0)
我想向您解释有关杰斯特评论的背景:
背景
您应该记住什么是汇编语言以及CPU和内存的工作方式。
对于PIC16器件,程序存储器以12位或14位为单位组织。这意味着内存可以存储数值,范围为0-4095或0-16383。
执行程序时,CPU将从内存中读取数字,并根据从内存中读取的数字执行某些操作。
在12位变量上,例如数字451使CPU执行加法运算。
汇编器是一种特殊的编程语言,其中每条指令(通常)对应于内存中的一个数字。指令ADDWF 3, 0
例如对应于内存中的数字451。
问题
您的程序长7条指令;程序存储器中有7个数字。
但是,PIC微控制器程序存储器的大小远远超过7个字。
因此,第三条NOP
指令后有一些内存。该内存将包含数字,但您不知道它包含哪些数字。
CPU将加载存储在其中的数字并执行它们。如果数字451存储在此处,则它无法知道这些数字是否有意存储(因为您的程序包含指令ADDWF 3, 0
)或数字是否无意存储,因为您的程序比内存短。