51單片機查表指令


51單片機查表指令
51單片機具有兩條查表指令,用於從 ROM 中讀出預存的數據:

MOVC A, @A + PC
MOVC A, @A + DPTR

問題:在“MOVC A,@A+DPTR”和“MOVC A,@A+PC”中,分別使用了DPTR和PC作基址,請問這兩個基址代表什么地址?使用中有何不同?
答案: 使用@A+DPTR基址變址尋址時,DPTR為常數且是表格的首地址,A為從表格首址到被訪問字節地址的偏移量。
使用@A+PC基址變址尋址時,PC仍是下條指令首地址,而A則是從下條指令首地址到常數表格中的被訪問字節的偏移量。

PC是程序計數器,DPTR是數據指針。用這個MOVC A,@A+DPTR比較方便的,DPTR是16位。范圍廣。建議使用。

這兩條都是查表指令,MOVC A,@A+PC,只能給累加器A賦值,所以只能查這條指令所在地址以后256字節范圍內的代碼或常數。
而MOVC A,@A+DPTR,可以給DPTR賦給任何一個16位的地址值,所以查表范圍可達整個程序存儲器64K字節空間的代碼或常數。

其中前一條指令的用法,比較難,使用的時候,需要計算一個“偏移量”。不了解“指令的字節數”的人,都不清楚應該如何計算。
做而論道曾在以前的文章中,介紹過“偏移量”的自動計算方法,可見如下鏈接:

--------------------
最佳答案:
51單片機匯編語言有一條查表指令是:
MOVC A, @A + DPTR
它不是單獨使用的,要和 DB 偽指令配套使用。

例如:若累加器A中有一個0~9的數,請用查表法求出該數的平方值,設平方表表頭地址為1000H。
程序如下:
;-------------------------------------
MOV DPTR, #1000H
MOVC A, @A + DPTR
……

ORG 1000H
DB 0, 1, 4, 9, 16, 25......
;-------------------------------------
DB 偽指令從 ROM 1000H 開始,順序存放了一系列的“平方”數據。
MOVC A, @A+DPTR 指令中的A,如果等於0,就會在“平方”數據中取出第0個,就是0;
MOVC A, @A+DPTR 指令中的A,如果等於1,就會在“平方”數據中取出第1個,就是1;
MOVC A, @A+DPTR 指令中的A,如果等於2,就會在“平方”數據中取出第2個,就是4;
MOVC A, @A+DPTR 指令中的A,如果等於3,就會在“平方”數據中取出第3個,就是9;
……
MOVC A, @A+DPTR 指令中的A,如果等於9,就會在“平方”數據中取出第9個,就是81。
-------------------------------
后記:
這條指令的用法,相對前一條就簡單了,事先並不需要計算“偏移量”。但是這條指令必須要使用寄存器DPTR。

大家知道,凡是涉及到片外RAM存儲單元的時候,基本上都要使用DPTR,這個DPTR寄存器通常是比較“繁忙”的,它形成了一個片內、片外之間,數據傳傳輸的“瓶頸”。因此在讀取ROM數據的時候,能夠不用這后一條指令,就不要用它,應該盡量使用前一條指令。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM