Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory PIC18F4321上的数据存储器及指令_Memory_Microcontroller_Pic - Fatal编程技术网

Memory PIC18F4321上的数据存储器及指令

Memory PIC18F4321上的数据存储器及指令,memory,microcontroller,pic,Memory,Microcontroller,Pic,我们正在研究PIC18F4321,在某个时候,我的教授在黑板上画了以下图表: 他使指令(如ADDLW 0X02、MOVWF 0X24等)在数据存储器中采用两个地址,因为PIC18F4321中的存储器地址仅采用一个字节,指令宽度为16位 但在PIC18F4321的数据表中,我找不到它说这些16位指令将永远存储在数据存储器中的位置。在他这么说之前,我认为数据存储器是用来存储寄存器值的,而不是完整的指令。另一方面,我知道也有程序内存,但程序内存不是8位宽,这使得他的画更加混乱 1) 16位指令是否存

我们正在研究PIC18F4321,在某个时候,我的教授在黑板上画了以下图表:

他使指令(如ADDLW 0X02、MOVWF 0X24等)在数据存储器中采用两个地址,因为PIC18F4321中的存储器地址仅采用一个字节,指令宽度为16位

但在PIC18F4321的数据表中,我找不到它说这些16位指令将永远存储在数据存储器中的位置。在他这么说之前,我认为数据存储器是用来存储寄存器值的,而不是完整的指令。另一方面,我知道也有程序内存,但程序内存不是8位宽,这使得他的画更加混乱

1) 16位指令是否存储在数据存储器中

2) 我发现解释这幅图的一种方法是,可能所讨论的内存不一定是8位宽,只是每个地址只能占用8位。所以,简单地说,你可以在这个地址中保存多少位。这是合理的解释吗

1) 16位指令是否存储在数据存储器中

不可以。数据内存不用于存储指令-您不能从数据内存执行任何代码。所有指令都存储在程序存储器中,该存储器由16位指令字组成。数据表详细说明了不同说明的格式和布局。有些指令是单字的,有些指令需要多个字。程序存储器由一个21位程序计数器寻址,该计数器包含一个2字节的空间,尽管对于PIC18F4321来说,只有8KB的程序存储器,相当于4096条单字指令

数据存储器由8位字节组成,由12位总线寻址,允许最多4096字节的数据存储器,尽管PIC18F4321只有512字节的数据存储器,分为两组256字节。此数据存储器包含应用程序中使用的SFR(特殊功能寄存器)和通用寄存器(GPR)

所有这些都将在第5节中进行更详细的解释

程序计数器(PC)寻址程序内存的方式通过强制PC的最低有效位为零来强制16位指令字对齐,这强制以两个字节的倍数进行访问。从数据表中引用:

电脑在程序存储器中寻址字节。防止电脑 与字指令(最低有效位)不对齐 PCL的值固定为“0”。电脑将以2的增量添加到地址 程序存储器中的顺序指令


我建议您彻底阅读链接数据表的第5节,看看您是否还有任何疑问。它包含了很多细节,但描述得很好,尽管需要多次阅读才能完全理解。

非常感谢您提供了如此直截了当的答案。我认为我的第二个假设是正确的(即指令的每个字节都有一个地址),因为在第58页(程序内存中的指令)中确实说“程序内存是以字节寻址的”,并且“指令在程序内存中存储为两个字节或四个字节”。@somename是的,这是正确的。所有内存都以字节的形式寻址,只是程序内存只允许访问偶数地址,因为PC的LSB被强制为零。正如你所说,单字指令是两个字节,双字指令是四个字节。