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