2.1 程式模型和儲存映射
P89C669保持了所有的80C51的儲存空間。附加的儲存空間也被透明的作為一部分添加進去,允許擴充定址。基本的儲存空間包括代碼儲存空間(可以是片內的或者片外的或者二者都有)、外部資料儲存空間、特殊功能寄存器和內部資料存放區空間(包括片內RAM,寄存器和堆棧),還有後備的被用作內部資料存放區的擴充,允許一個較大的處理器堆棧。
顯示了P89C669的程式模型和儲存映射:
Figure 3.
圖形三
下面的列表詳細描述了51MX儲存空間的不同部分:
DATA 128位元組的內部資料存放區空間(00h~7Fh),可以通過直接或者間接定址,使用除了MOVX和MOVC的其他指令訪問。所有或者部分的堆棧可以放在這個地區。
IDATA 間接資料(Indirect DATA)。256位元組的內部資料記憶體空間(00h~FFh),可以通過間接定址,使用除了MOVX和MOVC的其他指令訪問。所有或者部分的堆棧可以放在這個地區,這一地區包括了DATA地區和這裡的128個位元組的。
EDATA 擴充資料(Extended DATA)。這是一個DATA和IDATA的超集。P89C669在EDATA儲存空間中,有1280位元組的SRAM。這個附加的地區可以被用做堆棧訪問,通過使用通用指標的間接定址。堆棧可以放置在擴充的地區,如果這樣做可以的話。EDATA的內容可以使用EMOV指令在任何時候訪問,不管MXCON中的位EAM。
SFR 特殊功能寄存器。包括挑選的部分CPU寄存器,外圍控制和狀態寄存器,可以且僅可以通過直接定址訪問(定址範圍在80h~FFh)。這個也包括新的51MX擴充的特殊功能寄存器。
XDATA 外部資料(eXternal DATA)。和經典的80C51的64KB儲存空間一樣,可以通過MOVX指令並使用DPTR、EPTR、R0或者R1訪問。片內的XDATA可以在程式的控制下被禁止掉。同樣,XDATA也可以放置外部裝置。P89C669有768位元組的片內XDATA儲存空間。
HDATA 高端資料(High DATA)。這是一個XDATA的超集,可以包括高至8,323,072位元組(8M~64KB)的儲存空間,可以通過MOVX指令並使用EPTR、DPTR、R0或者R1來訪問。HDATA中非XDATA部分被放置外部裝置。
CODE 64KB的內部代碼儲存空間(0000h~FFFFh),被用來做程式儲存和資料(通過MOVC指令)。
ECODE 最高大8MB的代碼儲存,可以作為程式執行的一部分或者通過MOVC指令訪問。
除了SFR的所有這些空間也可以用EMOV指令,通過使用通用指標的定址方式訪問。這個特性在後面的節中被詳述。
TABLE 1
Memory Size (Bytes) and MX UniversalMemory Map Range
Type Description P89C669
DATA data memory that can be addressed both directly and indirectly; can be used as stack 128 (7F:0000-7F:007F)
IDATA superset of DATA; memory that can be addressed indirectly (where direct address for upper half is for SFR only); can be used as stack 256 (7F:0000-7F:00FF)
EDATA superset of DATA/IDATA; memory that can be addressed indirectly using Universal Pointers (PR0,1); can be used as stack 1280 (7F:0000-7F:04FF)
XDATA memory (on-chip "External Data") that is accessed via the MOVX instructions using DPTR/EPTR 768 (00:0000-00:02FF)
CODE code memory used for program storage and data access using MOVC and EMOV 65536 (80:0000-80:FFFF)
ECODE code memory used for program storage; data access can be accomplished using Universal pointers (PR0,1) and EMOV 98304 (80:0000-81:7FFF)
表一
2.2 資料存放區(DATA,IDATA和EDATA)
標準的80C51內部資料存放區由256位元組的DATA/IDATA RAM組成,它總都是片內的。在這個空間中有:資料寄存器(R0~R7),預設堆棧,一點可以定址的RAM地區和通用目的資料RAM。在DATA/IDATA儲存空間的頂部是一個1024位元組的RAM塊,它可以作為堆棧訪問或者通過間接定址訪問。這樣一起形成1280位元組的EDATA RAM。資料存放區的不同部分在下面的節中被描述。
2.2.1 寄存器R0~R7
通用目的寄存器R0~R7允許快速、有效訪問一些內部資料存放區的情況。比如這個指令:
MOV A,R0
只使用了一位元組的代碼並且執行只用了1個機器周期。使用直接定址來完成同樣的結果,如:
MOV A,10h
需要兩個位元組的代碼儲存空間和兩個機器周期的執行時間。間接定址還需要一些指標寄存器的設定等。
這些寄存器是"堆疊"(bank)的,即有四組寄存器,任何一組都可以被選擇用來表示從R0到R7在適當的時候。期望的寄存器"堆疊"使用PSW特殊功能寄存器中的位RS1和RS0來選擇。這一特性可以被用來最小化在中斷服務或者子常式的上下文環境切換的時間,或者為複雜演算法提供更多寄存器空間。
寄存器和其他內部資料存放區情形沒有不同,除了它們可以用"速記"符號定址,如:"R0"、"R1"等。換句話說,定址內部資料存放區的指令,如直接或者間接定址,都完全可以訪問作為4個"堆疊"中任一寄存器組中同樣的實體儲存體位置。
TABLE2
RS1 RS0 bank memory segment in DATA
0 0 Bank 0 00h...07h
0 1 Bank 1 08h...0Fh
1 0 Bank 2 10h...17h
1 1 Bank 3 18h...1Fh
2.2.2 可按位定址的RAM
內部資料存放區地區20h到2Fh可以作為位元組和位被訪問。這樣提供了一個方面的、有效方式來操作獨立的標誌位,而不用使用很多的儲存空間。最底下的位所在的位元組在地址20h,位編號為00h,下一位在同一位元組,位編號為01h等等,最後一位,也就是在2Fh的位元組的位7,位編號為7Fh(127).上面提到的位編號都和特殊功能寄存器中位相關。
這段代碼:
SETB 20h.1
CPL 20h.2
JNB 20h.2, LABEL1
設定在地址20h的位1(置位),補足同樣位元組的位2(求補),然後如果第二位不和1相等就分支(跳轉)。在實際的程式中,這些位通常會被給予一些名字,並且提供給位操作指令使用。
2.2.3 擴充資料存放區(EDATA)
51MX架構允許對內部資料存放區空間進行超過(80C51經典的)256位元組限制的擴充。這一空間可以被用來作為一個擴充的或者可選的處理器堆棧空間,或者可以在程式的控制下被用來作為通用目的儲存。除了基於堆棧指標來訪問(當擴充堆棧儲存模式被開啟時,參見下面堆棧的節)這個空間外,這一儲存空間還可以使用通用指標這個新的特性來定址。通用指標在後面的節中被描述。
2.2.4 堆棧
處理器堆棧提供了一個方法來儲存中斷和子常式的返回地址,還有臨時資料。堆棧向上增長(譯者註:PC機一般是向下增長的),從較低地址到較高地址。當前堆棧指標總是指向最後被壓到棧上的資料,只要堆棧不空。向前的壓棧操作,堆棧指標值遞增,然後資料被寫入儲存空間。當堆棧出棧,使用相反的過程。首先,資料從儲存空間中被讀出來,然後堆棧指標值遞減。
51MX堆棧的預設配置和經典的80C51是同樣的實現。當中斷或者子常式地址被壓入堆棧時,僅僅程式計數器器低16位被儲存。中,顯示了這個預設的80C51模式的堆棧操作:
Figure 4
對於堆棧,有兩個配置選項。為了和經典80C51向後相容的目的,兩種附加模式在晶片重設時被禁止掉。
第一個選項,擴充中斷楨模式,使中斷把整個23位的程式計數器壓入堆棧(按3個位元組),而且使RETI指令把整個23位成熟儲存空間作為返回地址彈出堆棧,在圖Figure 5中。包含程式計數器最高有效位元組的堆棧位元組的高位被強製為1以和通用指標定址一致。
因為一個中斷可以在程式中任何點發生,因此就需要儲存整個23位的程式計數器值,它包括了超過64KB的程式。擴充中斷楨模式只改變中斷和RETI指令的操作,其他的調用和返回沒有被影響。特別的擴充的調用和返回指令允許大的程式使用整個23位返回地址在整個代碼空間來回移動。使用MXCON寄存器中的EIFM位來開啟擴充中斷楨模式。
Figure 5.
第二個堆棧選項,擴充堆棧儲存模式,允許堆棧擴充,超過經典80C51族的256位元組的限制。堆棧擴充通過增加堆棧指標到16位和允許它定址整個EDATA儲存地區(而不是僅僅標準的256位元組內部資料存放區空間)來實現。堆棧擴充對儲存在堆棧上的資料沒有影響,它會繼續被儲存,見圖Figure 4和5。通過設定MXCON寄存器中的ESMM位來開啟擴充堆棧記憶體模式。
如果堆棧指標沒有被軟體初始化,那麼堆棧會從片內RAM的地址8開始,就象80C51。同樣注意擴充堆棧儲存模式,P89C669部分在DATA/IDATA頂部擁有1024位元組的RAM空間可作為堆棧。
堆棧模式位ESMM和EIFM在圖Figure 6被顯示。注意在程式初始化過程中且在那以後堆棧模式位沒有改變,那麼堆棧模式位就要被設定。動態改變堆棧模式會導致堆棧同步問題。
2.2.5 MX控制寄存器(MXCON)
微控制器的MX家族是在一個給80C51使用者提供一個可以允許應用程式在不同方向增長的部分的這樣一個想法下開發的。在改進許多特性時,還要必須保持完全的和前代的相容性。
有兩個主要的改進的方面,一個是可以辨別的微控制器內部資源,一個是微控制器對外的地址和資料匯流排介面。
MX2部分,和先前的與80C51相容的微控制器比,帶來更大的可獲得的片內代碼和資料空間。為了使這些改進被利用,添加了MX具體的特性,相應地也增強了指令集。
MX控制寄存器(MXCON)決定了669的操作模式。不建議在應用執行中改變寄存器,儘管這是可能。MXCON的結構在圖Figure 6中被顯示。使用位EAM,共有兩個操作模式可以使用。
EAM=0
在重設後,位EAM=0(預設值)使P89C669部分處於完全80C51二進位相容的微型模式。它和外面的介面是16位寬的地址匯流排和8位寬的資料匯流排。程式計數器(PC)是16位寬,因此片內可執行代碼不能超越64KB位址範圍。MX被用來傳遞PC的特殊指令(如EMOV)的使用被限制在PC的低16位的值。高7位全被當作0來對待。這就是為什麼EMOV指令不能從超過64KB界限的內部代碼空間取回內容。如果代碼從片內代碼空間開始,那麼就沒有外部代碼能夠被執行,地址匯流排也只能訪問64KB以內的RAM。
EAM=1
EAM=1決定的模式使片內代碼超過64KB並可以利用96KB的代碼空間。對外部儲存的介面是通過標準51外部匯流排:16位地址和8位元據匯流排。在這個配置中,程式儲存空間(PC)在內部是23位寬的,當EIFM(Extended Interrupt Frame,擴充中斷楨)位被配置時需要特別的注意。如果可執行片內代碼超過64KB而且這個代碼被中斷,那麼EIFM必須被置位,因為中斷指令的地址可能是01:xxxx類型。當PC跨越64KB時,保持EIFM=0會導致僅壓入2位元組的地址到堆棧。因而在調用插斷服務常式被完成後,RETI指令會進一步指示代碼執行到00:xxxx(由於只從堆棧彈出兩位元組),這樣會導致不可預料的系統行為。
如果片內在超過64KB的儲存代碼空間都僅僅被用來儲存常量(如尋找表),這時EIFM可以被設為0,因為任何被執行的代碼的地址可以僅由兩個位元組表示,並且只需要把兩個位元組壓入棧中即可(對於P89C669部分,這是預設的)。
如果代碼從片內代碼空間開始,那麼就不會有外部代碼被執行;地址匯流排僅可以訪問達64KB的外部RAM。由於這一模式僅僅是16位寬的地址匯流排,即使EMOV指令指向超出64KB的位置(如yz:xxxx),外部儲存會把這個當作64KB以為的地址(00:xxxx)來識別。
Figure 6
EAM位控制訪問的CODE/ECODE和XDATA/HDATA的空間。EDATA儲存空間能夠全部在任何時候用EMOV指令訪問,不管EAM位的值。
2.2.6 通用目的RAM
那些沒有被用作寄存器、堆棧和位定址地區的特別應用的部分內部資料存放區區,它們可以被考慮用作通用目的RAM和用在任何需要的場合。
低128位元組的內部資料存放區(DATA)可以用直接或者間接定址來訪問。直接定址合并整個指令中的地址。比如,這個指令:
MOV 32h,#10
將會儲存值10(10進位)在位置10h。直接定址128以上的空間會訪問特殊功能寄存器而不是內部資料存放區了。
間接定址定址利用當前"堆疊"中的R0或者R1的地址,並用它來識別在內部資料存放區中的一個位置。整個256位元組內部資料存放區空間(IDATA)可以用間接定址方式訪問。比如,這個指令列:
MOV R0,#90h
MOV A,@R0
這樣會導致90h除的內容被讀入累加器。在可以用直接和間接定址都可以訪問的低端地區保留更多的通用目的RAM,會致使堆棧在高端地區被定位,這個對於經典80C51很典型。對於51MX,堆棧可以被擴充也可以被完全移出低256位元組的儲存範圍。
Figure 7.