MCS-51
使用哈弗结构
,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如
Microchip
公司的
PIC16
芯片的程序指令是
14
位宽度,而数据是
8
位宽度。
程序存储器
,有片内和片外两部分。而且无论片内程序存储器,还是片外程序存储器,他们的地址是共享的。如果片内4k ROM的话,地址就是0x0000-0x0FFF,从0x1000-0xFFFF就是外部ROM的地址空间。可外部ROM的0x0000-0x0FFF的这一部分是否使用呢,这取决于单片机EA引脚的电平值。EA=1时就是使用内部ROM的这一部分,外部ROM的这一部分浪费不用;EA=0时就是使用外部ROM的这一部分,内部ROM浪费不用。从CODE段读取数据要使用汇编的MOVC指令,单片机会根据MOVC指令、EA状态、要读取的地址值,来自动地判断从什么存储器里取数据。
数据存储器,
则分为内部数据存储器(
IDATA/RAM
)和外部数据存储器(
XDATA
)两个部分,但这两个存储器就不像
code
存储器那样共享地址空间的了。一般的
8051
芯片,内部
RAM
只有
128B
,从
0x00-0x7F
,而从
0x80-0xFF
则是
SFR
(
CPU
工作寄存器和各种外设寄存器都在此)的区域。对于
8052
来说,内部
RAM
有
256B
,所以
0x80-0xFF
是高
128B
的
RAM
在使用。可这部分不是
SFR
专用的吗?是
SFR
专用,但注意,
SFR
的访问只能使用
“
直接寻址方式
”
(使用特定的汇编指令来实现),区别就在这里。只有通过直接寻址访问的地址才是
SFR
,否则就是普通的
RAM
。至于外扩的
RAM
(
XDATA
),地址也是从
0x0000-0xFFFF
的,而且这里的
0x0000
和内部
RAM
的
0x00
是不同的,是完全独立的两个空间。他们的访问方法也是不同的。
MCS-51
使用
MOVX
指令,来读写
XDATA
区。而且,访问
XDATA
区,是需要
DPTR
寄存器来辅助的。因为只有
DPTR
才能装得下十六位的
XDATA
地址。
data:固定指前面0x00-0x7f的128个RAM,可以用a寄存器直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:movACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)
xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movxACC,@Rx读写。
ARM
(甚至是x86)这种冯诺依曼
结构的
MCU/CPU
,它的地址空间是统一并且连续的,代码存储器
/RAM/CPU
寄存器,甚至
PC
机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。
冯诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086
中央处理器的程序指令和数据都是16
位宽。
6 k) e: K5 O& p0 G8 J- a
% z0 h; K# q$ V; R+ l6 L3 B& @0 A
m4 e! b _* P |