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