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