第2章 存储组织【2】

来源:互联网 发布:游戏程序员工资待遇 编辑:程序博客网 时间:2024/05/18 01:44
2.3 特殊功能寄存器
特殊功能寄存器为处理器提供了一种访问内部控制寄存器,外围设备和I/O端口的方式。一个特殊功能寄存器地址总是被全部包含在一个指令内。
标准的特殊功能寄存器空间是128字节大。为了提供对外围设备的控制或者访问CPU特性和功能,特殊功能寄存器在每一个51MX设备中,按照需要被实现。未定义的特殊功能寄存器被当作保留,而且不应该被用户程序访问。
在特殊功能寄存器空间的16个地址都是可字节和位寻址的。可位寻址的特殊功能寄存器是那些以0h或者8h结尾的地址(也就是80h,88h,…,F8h)。位寻址允许直接控制和测试那些特殊功能寄存器的位。所有51MX设备也有附加的128字节的扩展的特殊功能寄存器(在《51MX架构参考》)中有讨论)。Figure 8和9显示了对于P89C669部分的特殊功能寄存器和扩展特殊功能寄存器的映射图。
Figure 8
Figure 9
2.4 外部数据存储(XDATA)
51MX的XDATA空间和经典80C51上的64KB的外部数据存储空间一样。
片内XDATA存储可以通过AUXR寄存器的EXTRAM位在程序控制下禁止掉。访问以上实现的在片内XDATA默认会被引导到外部总线去。如果片内XDATA存储被禁止,那么所有的XDATA访问会被引导到外部总线去。P89C669有768字节的片内XDATA。
2.5 高端数据存储(HDATA)
51MX架构使用23位寻址,支持达8MB数据存储空间。整个8MB空间中除过64KB的EDATA空间剩下的被称作HDATA。XDATA空间包含了HDATA的低64KB。
数据指针51MX为了允许方便地扩展现有的80C51程序来使用超过64KB的数据存储,添加了一个23位的扩展数据指针(EPTR)。如果我们想访问定位在超出的第一个64KB范围内的HDATA RAM中的一个单独的数据字节,MXCON特殊功能寄存器中EAM位必须被置位(EAX=1)。
所有用DPTR的80C51指令都有一个使用EPTR的51MX变体。23位的EPTR由(按顺序)EPH、EPM和EPL特殊功能寄存器组成。图10和11显示了分别使用DPTR和EPTR间接访问数据存储的例子。因为EPTR是23位,所以EPH的第8位没有使用。如果读,它返回1,象其他在特殊功能寄存器中未实现位一样。EPTR可以被当作23位寄存器或者3个独立的8位寄存器来操作。使用EPTR允许访问整个HDATA空间,包括XDATA。任何时候,一个指定的数据指针都是活动的且被和DPTR相关的指令使用。活动的数据指针(DPTR)由一个高字节(DPH特殊功能寄存器)和一个低字节(DPL特殊功能寄存器)组成,而且它的目的功能就是保存一个16位的地址;然而,它可以被当作16位寄存器或者作为两个独立的8位寄存器来操作。活动DPTR的选择可以通过改变数据指针选择(DPS)位来改变。DPS位占用了AUXR1的最底位。DPS位仅被应用于两个DPTR,不是EPTR。
在间接寻址模式,当前活动的DPTR或者EPTR分别为访问XDATA和HDATA提供一个数据存储地址。当DPTR被用来寻址时,只有XDATA空间可以获得。当EPTR被用来寻址时,整个HDATA空间(包含XDATA空间)可以被访问。如果EPTR值超过7E:FFFF(HDATA的限制),使用EPTR进行数据访问会引起未定义的结果。限制HDATA地址是为了保持对EPTR寻址和通用指针寻址(在本文的后节中结实)的寻址统一。
Figure 10
Figure 11
2.6 程序存储(CODE)
80C51,当然也有51MX,都是“哈罗德”架构,意味着代码和数据空间是分离的。如果有一个可执行代码的字节超出64KB,那么MXCON特殊功能寄存器的EAM位就必须被置位(EAM=1)。同样,有一个在CODE的常量超出64KB边界,而且这个常量要被应用程序读取,那么EAM位也必须被置位(EAM=1)。
51MX架构扩展80C51程序计数器到23位,提供了一个连续的,不分段的线性代码空间,这个可能有8MB大。片内空间从代码地址0开始,扩展到片内代码存储的界限。超越这个界限,代码会被从片外取到。51MX架构可选提供了外部总线,它支持:
·混合模式(一些片外代码和/或数据存储)
·单片操作(没有外部总线连接)
·无ROM操作(没有使用片内代码存储)
在一些情况下,代码存储可以被当作数据来寻址。扩展的指令寻址模式通过使用有索引的间接寻址可以访问整个带个8MB带代码空间。当前活动的DPTR、EPTR、通用指针或者程序计数器可以被当作基址来使用。图12到24显示了不同代码存储寻址模式的例子。
重置之后,象经典80C51一样,P89C669从地址00:0000h开始代码执行。相似地,中断向量被放置在重置地址之上,从地址00:0003h开始。需要注意的是第一条指令(在地址0处)不应该是一个EJM指令。EJMP是一个5字节的指令,这样会和在地址00:0003h的外部中断向量0重叠。
2.7 通用指针
特别地为了在很大程序上增强C语言的代码密度和性能,一个新的寻址模式叫作通用指针模式也已被添加进51MX。这个寻址模式允许使用一个指令访问任何片内的和片外的代码和数据空间,而不需要进一步知道数据在不同空间中的哪一个。这包括DATA、IDATA、EDATA、XDATA、HDATA和CODE空间。SFR空间是唯一不可以使用通用指针访问的空间。
通用指针寻址模式使用了一个新的指针寄存器集,这里有两个原因。第一个是为了允许寻址8MB代码空间和8MB数据空间,需要24位指针;第二个原因是操作寄存器中的多字节数据要比SFR中的有效地多。C编译器实际就是在寄存器中进行指针操作,然后再把结果移到数据指针来使用。
支持两个通用指针:PR0和PR1。PR0指针由当前寄存器“堆叠”中的寄存器R1、R2和R3组成,而PR1由当前寄存器“堆叠”中的寄存器R5、R6和R7组成。见图15。
为了通过一个单一并统一的方式来访问所有的不同的存储空间,这些存储空间必须被映射到一个新的16MB总存储空间大小的视图。这一新视图叫作通用存储映射。XDATA空间被放置在新地址映射的底部。HDATA空间紧接着XDATA的上面。标准内部数据存储空间(DATA和IDATA)在HDATA的上面,后面剩下的是EDATA空间。最后,代码存储空间占用了映射的最顶部分。因此,通用指针的最高有效位决定了访问代码还是数据存储。通过把XDATA空间放置在通用存储映射的底部,通用指针从00:000h到00:FFFFh的地址可以和经典80C51的外部数据存储空间一致。这样就提供了在不需要多于64KB外部数据空间时代码的完全的向上兼容性。图16显示了通用存储映射,图17显示了标准存储空间和如何与通用指针的值相关通用指针仅被51MX的一个新的叫做EMOV的指令使用。EMOV指令允许通过一个通用指针将数据移进或移出累加器。不管是移进还是移出,可以指定0、1、2或者3的偏移,这个偏移会加上前面使用的指针。偏移允许C编译器不用改变指针的值,可以访问最多4个字节大的变量(比如长整型)。图18显示了一个通用指针用法的例子。注意在通用存储映射中的CODE区域保存值是不可能的。另一个被添加的新的指令允许用值1到4来递增任一通用指针。这样允许指针越过最后被访问的数据元素,而指向下一个数据元素。
通用指针主要被设计用来方便在扩展寻址模式(当MXCON中的位EAM被置位时)下寻址。然后,通用指针仍然可以在当EAM=0时被使用。在这样的情况下,通用指针寻址仅可以访问底下的64KB代码空间和底下的64KB的XDATA空间。指向这些区域的通用指针的值不能被更改。当EAM=0时,通用指针访问这些区域以外的不可访问的区域时,会返回值FFh
原创粉丝点击