51基址偏址的間接尋址方式詳解
MCS-51中的查表指令中有尋址方式是采用基址偏址的間接尋址方式
MOVC A, @A+DPTR
我對這個命令一直不理解,@DPTR中應該是數(shù)據(jù)吧,@A中也是數(shù)據(jù),他們相加怎么能是地址呢?
DPTR是程序地址,A是偏移量,A+DPTR仍是程序地址,@A+DPTR是該地址中的數(shù)據(jù)值。
內容 地址
…
25 TABLE+5
16 TABLE+4
9 TABLE+3
4 TABLE+2
1 TABLE+1
0 TABLE
…
ROM印象圖
例子:根據(jù)累加器A中的數(shù)(0-5),用查表的方法求平方值。
將0-5的平方值利用DB偽指令將其存放在程序存儲器的平方值表中,將表的首地址送到DPTR中,將待查的數(shù)(設在R0中)送到A中,程序如下:
MOV DPTR,#TABLE ;(1)
MOV A,R0 ;(2)
MOVC A,@A+DPTR ;(3)
……
TABLE:DB 0,4,9,16,25
要理解這個程序,要從后面看起。
DB是一條偽指令,它的用途是將其后面的數(shù),這里也就是0,4,9,16和25放在ROM中,注意,這里的“放”不是在程序執(zhí)行時,而是在程序被編譯時就完成了。上面的圖是存儲器的映象圖,其中有就有這些數(shù),并且這些數(shù)在ROM中是順序存放的,而0所在單元的地址就是TABLE。TABLE在這里只是一個符號,到了最終變成代碼的時候(匯編時),TABLE就是一個確定的值,如1FFH或23FH等等。但在這里,用符號來表示更方便,所以就以TABLE稱呼之。
來看一下程序的執(zhí)行情況。
首先執(zhí)行第一行,即將TABLE送入DPTR中。然后執(zhí)行第二行,取出欲查表x的值,如果設這個值是2,來看一看會有什么情況。
在執(zhí)行第三行時,將DPTR中的值(現(xiàn)在是TABLE)和A中的值相加,即得到結果TABLE+2,然后以這個值為地址,到ROM中相應單元中去取數(shù),看一下圖3-10中這個單元中的值是多少,是4,正是2的平方,所以就獲得了正確的結果。
為什么這個例子要用TABLE來作說明,好像很別扭,如果我們將數(shù)據(jù)存放在1000H單元開始的5位地址中,即1000H單元放入0,1001H單元放1,1002單元放4……依此類推,不是更好理解嗎?先把1000H送到DPTR,即DPTR的值是1000H,然后A獲得的值是2,然后再執(zhí)行第三行時,就是從1000+2=1002H單元中找數(shù),即找到4。這樣更直觀些。
的確,這樣更直觀些,也可以這樣做,但是好多時候這樣做并不方便。因為在編程時并不知道哪些ROM單元是可以空出來放這些數(shù)據(jù),如果隨意定一個值可能會造成浪費或不能夠放下程序。即便精確地計算好放置的位置,一旦表格前面的程序有所改動又會變得不恰當??傊?,如果直接給出數(shù)值,則表格在ROM中的位置是由人為固定的,使用不方便,而比較好的方法是表格的位置是浮動的,也就是說根據(jù)表格前面的程序量的不同其位置可以發(fā)生變化。因而在程序中給出一個標號,由匯編程序根據(jù)前面所需放的程序的量來算出存放的位置。很多時候,不直接給出具體的數(shù)值,而是用標號來表示。