DPTR是某些單片機中一個功能比較特殊的寄存器,是一個16位的特殊功能寄存器, 其高位字節(jié)寄存器用DPH表示,低位字節(jié)寄存器用DPL表示,DPTR既可以作為一個16位的寄存器來處理,也可以作為兩個獨立的8位寄存器來使用
主要功能是存放16位地址,作為片外RAM尋址用的地址寄存器(間接尋址),故稱數(shù)據(jù)指針,也可以將外部RAM中地址的內(nèi)容傳送到內(nèi)部RAM的地址所指向的內(nèi)容中。DPH和DPL的地址分別為83H、82H。
單片機雙DPTR的使用方法
1.簡述
在重新設計程序升級的過程中,51系列單片機增加了另一個數(shù)據(jù)指針DPTR
軟件能利用附加的數(shù)據(jù)指針加快程序的執(zhí)行速度和縮減程序大小
本文的開始概述了原數(shù)據(jù)指針的操作接著簡述了新數(shù)據(jù)指針如何匹配原先數(shù)據(jù)指針本文還解釋了雙數(shù)據(jù)指針部分在物理和軟件上的識別最后還對采用雙數(shù)據(jù)指針的各種軟件策略包括匯編語言中斷和C進行了說明
2數(shù)據(jù)指針DPTR的概述
在Intel MCS-51單片機結構中16位DPTR寄存器能對存貯區(qū)內(nèi)的各個部分進行尋址使用DPTR尋址存貯器的指令如下所示
MOVX @DPTR,A 將累加器A的內(nèi)容送到由DPTR尋址的數(shù)據(jù)存貯區(qū)內(nèi) MOVX A@DPTR 將由DPTR尋址的數(shù)據(jù)存貯區(qū)內(nèi)的內(nèi)容送到累加器A
8051結構用腳PSEN和RD分別選通程序存貯器只讀和數(shù)據(jù)存貯器MOVX指令訪問數(shù)據(jù)存貯器(例如RD腳數(shù)據(jù)存貯器一般是指RAM或存儲映像I/O
MOVC A@DPTR 將由DPTR尋址的程序存貯區(qū)內(nèi)的內(nèi)容送到累加器A
MOVC指令通過訪問程序存貯器例如PSEN腳,以存取只讀常數(shù)(例如:數(shù)據(jù)表字符串)程序存貯器一般是指ROM或EPROM JMP @A+DPTR 轉移到由DPTR和A的內(nèi)容相加形成的地址處
相加形成的地址送PC寄存器DPTR和A都沒有改變這條指令常用于執(zhí)行查表功能在表內(nèi)DPTR指向表的基址變址由A表示 操作DPTR的指令如下所示
INC DPTR DPTR加1
MOV DPTR#16 將16位立即數(shù)送到DPTR
然而DPTR也與其他CPU寄存器如ABPSW一樣被操縱為特殊功能寄存器SFR所有特殊功能寄存器通過各種指令例如PUSH和MOV存取字節(jié)并采用直接尋址方式
16位DPTR可被映像成兩個特殊功能寄存器 用于字節(jié)尋址這兩個特殊功能寄存器即為DPH高位字節(jié)地址為83H和DPL低位字節(jié)地址為82H指令如下 MOV DPTR#1234H 用立即數(shù)1234H裝載DPTR
其功能等同于執(zhí)行下面兩條程序但執(zhí)行程序的時間和程序大小不相等 MOV DPH#12H 將立即數(shù)12H送到DPTR高字節(jié)83H MOV DPL#34H 將立即數(shù)34H送到DPTR低字節(jié)82H
3雙DPTR數(shù)據(jù)指針
下面的51系列CPU通過采用雙數(shù)據(jù)指針而得到升級P8xC51P8xC52P8xC54P8xC58
聯(lián)系飛利蒲半導體廠商以確定這些產(chǎn)品和將來產(chǎn)品的雙數(shù)據(jù)指針的轉換狀態(tài)參見圖1這些升級的CPU仍然只有一個邏輯數(shù)據(jù)指針但可分成兩個在物理上獨立的數(shù)據(jù)指針索引單邏輯數(shù)據(jù)指針例如通過把DPTR作為一個操作數(shù)的指令可根據(jù)AUXR1特殊功能寄存器地址為A2H的DPS位的狀態(tài)以確定使用其中物理數(shù)據(jù)指針之一類似地SFR尋址DPH83H和DPL82H的索引可訪問當前選擇的數(shù)據(jù)指針。
復位時DPS被設置為0為了能簡單處理DPSAUXR1中的非定義位可寫入任何值但讀操作時只能為1CPU是采用單數(shù)據(jù)指針還是雙數(shù)據(jù)指針可通過檢測DPS位的當前值來決定
下面對80C51僅為80C51的AUXR1特殊功能寄存器作專門的說明具有雙數(shù)據(jù)指針的新80C51 AUXR1的格式與上面AUXR1的格式有稍微的不同圖2所示位3為WUPD從低功耗模式喚醒模式選擇位當復位時WUPD和DPS一起設置為0利用CPU掉電方式的應用程序在復位后能把WUPD置1使能喚醒特性位2定義為0是為了容易處理DPS位正如下節(jié)所描述的。
圖2 AUXR1#的定義80C51
4匯編語言
附加的數(shù)據(jù)指針能通過許多途徑加速程序的執(zhí)行和縮減程序大小例如通過用一個數(shù)據(jù)指針作為源指針另一個作為目的指針能很好地處理許多通用塊操作比如復制比較搜索等
------------------------------------------ 塊移動使用雙數(shù)據(jù)指針
破壞DPTR0DPTR1A和PSW
注釋DPS退出時的狀態(tài)與入口時的狀態(tài)相反 除非把額外的INC AUXR1的指令增加進去
----------------------------------------- 00A2 AUXR1 EQU 0A2H
0000 909000 MOV DPTR#SOURCE 用DPTR存源地址
000305A2INC AUXR1
切換數(shù)據(jù)指針
0005 90A000 MOV DPTR#DEST 用DPTR存目的地址
0008 LOOP
0008 05A2 INC AUXR1 切換數(shù)據(jù)指針
000A E0 MOVX A@DPTR
從源地址處取字節(jié)000B A3 INC DPTR
增加源地址000C 05A2 INC AUXR1
切換數(shù)據(jù)指針000E F0 MOVX @DPTRA 向目的地址寫入字節(jié)000F A3 INC DPTR 增加目的地址0010 70F6 JNZ LOOP 檢查是否為00012 05A2 INC AUXR1 可選還原DPS
對于處理AUXR1的DPS位INC是一條短2個字節(jié)且執(zhí)行速度快12個時鐘的命令然而INC指令不能直接使DPS位處于參與狀態(tài)而是要對DPS位進行簡單切換 在簡單的程序操作中例如塊移動DPS位只是以適當順序被切換而不是通過它的
實際值換句話說塊移動操作不用理會入口時DPS位的值是0還是1
注意到如果沒有最后一條指令INC AUXR1程序會在DPS處于相反狀態(tài)時退出對于80C51位2定義為0這樣重復的INC操作不會傳播位2上次的值且不會影響WUPD位
在某些情況下例如錯誤恢復或中斷僅切換DPS位是不夠的DPS必須設置為一個已知值且這個值與當前狀態(tài)無關
53A27E ANLAUXR1#7EH DPS=0
43A201 ORLAUXR1#1 DPS=1 每條指令都占用3個字節(jié)和24個時鐘
5中斷
另外一種采用附加數(shù)據(jù)指針的情況是用數(shù)據(jù)指針處理一個或多個中斷在傳統(tǒng)方式例如單數(shù)據(jù)指針處理程序必須存放入口時DPTR的當前值一般存到寄存器或堆棧處用處理器的值裝載DPTR在退出時反向處理
現(xiàn)在在典型的前臺和后臺中斷模式中每個處理器能單獨使用數(shù)據(jù)指針通過去掉用單數(shù)據(jù)指針的指令在數(shù)據(jù)指針之間進行切換能加速中斷響應速度和縮減程序大小
在更多情況下這些情況包括有兩個中斷處理器和/或在多于一個處理器中使用兩個數(shù)據(jù)指針數(shù)據(jù)指針能被共享使用方法與傳統(tǒng)的單數(shù)據(jù)指針儲存和恢復DPTR一樣由于這種方案一般能通過對SFR尋址來實現(xiàn)因此支持直接尋址模式例如PUSH或MOV的任何指令都能被使用
在一些情況下例如中斷或子程序調(diào)用有必要存DPS位的狀態(tài)因為中斷或子程序嵌套在使用DPTR時會破壞DPS通過使用支持直接尋址模式例如PUSH或MOV的的任何指令AUXR1特殊功能寄存器能含有DPS被儲存和恢復
這些技術應用到塊移動例子中兩個數(shù)據(jù)指針的內(nèi)容會被儲存和恢復由于這個塊移動程序的DPS值在退出時等同于入口時的值DPS的狀態(tài)AUXR1的內(nèi)容不需要準確地被儲存
--------------------------------------
塊移動程序使用雙數(shù)據(jù)指針
這個程序能儲存和恢復數(shù)據(jù)指針的狀態(tài)
僅破壞A和PSW
-------------------------------------
00A2 AUXR1 EQU OA2H
0000 C083PUSH DPH 存第一個數(shù)據(jù)指針
0002 CO82PUSH DPL
0004 909000 MOV DPTR#SOURCE 用它存放源地址
0007 05A2INC AUXR1 切換數(shù)據(jù)指針
0009 C083PUSH DPH 存第二個數(shù)據(jù)指針
000B C082PUSH DPL
000D 90A000MOV DPTR#DEST 用它存放目的地址
0010 LOOP
0010 05A2INC AUXR1 切換數(shù)據(jù)指針
0012 E0MOVX A@DPTR 從源地址處取字節(jié)
0013 A3INC DPTR 增加源地址
0014 05A2INC AUXR1 切換數(shù)據(jù)指針
0016 F0MOVX @DPTRA 向目的地址處寫入字節(jié)
0017 A3INC DPTR 增加目的地址
0018 70F6JNZ LOOP 判斷是否為0
001A D082POP DPL 恢復第二個數(shù)據(jù)指針
001C D083POP DPH001E 05A2INCV AUXR1 切換數(shù)據(jù)指針
0020 D082POP DPL 恢復第一個數(shù)據(jù)指針
0022 D083POP DPH
6C編譯器
C編譯器的操作不會受到附加數(shù)據(jù)指針的影響假設在RESET后DPS位不改變則C程序將繼續(xù)使用單數(shù)據(jù)指針
在許多情況下程序混合含有C和匯編語言使用當前論及的技術匯編語言部分例如常規(guī)程序庫入口中斷處理程序等能得到升級在不影響C編譯器使用第一個數(shù)據(jù)指針的情況下匯編語言能使用第二個數(shù)據(jù)指令
用‘C’編寫的應用程序有很多好處它采用雙數(shù)據(jù)指針從而使編譯器得到升級如圖3所示 通過修改塊定向COPY和MOVE庫程序性能提高的升幅是顯而易見的約15-30%以后代碼發(fā)生器和參數(shù)的最優(yōu)化會獲得更好的性能改進
圖3 雙DPTRC的性能改進
評論
查看更多