1樓:
我的分析不一定對,僅供參考。
基本思路是從r2r3處取偏移量,乘以2(每個資料為2個位元組)通過a加給dptr,r2加給dpl,r3加給dph,再從dptr處取數,交給a,再給r2r3.
mov dptr,#tab 表的首地址給dptr
mov a,r3 r3的值給a
clr c c置零
rlc a a乘2(左移一位後補零)
xch a,r2 a和r2交換數值
rlc a a左移一位,即乘2
xch a,r2 a和r2交換。至此,相當於r3乘2後給了r2,r2裡存的是r3.乘2後的數,a裡是r2乘2後的數。
add a,dpl dpl的值加給a
mov dpl,a;調整dpl,dph 相當於把原r2裡的數乘2當做偏移地址加給dpl
mov a,dph
addc a,r2
mov dph,a 相當於把原r3裡的數乘2當做偏移地址加給dph
clr a
movc a,@a+dptr;查表
mov r2,a;第一位元組
clr a
inc dptr
movc a,@a+dptr;查第二位元組
mov r3,a
rettab: dw ***xh;共1024個資料項
dw ***xh
......
dw ***xh
因為查表的數字是雙位元組,所以低位給r2,高位給r3.
2樓:匿名使用者
查表程式是要從一個專門的資料區內找到你所需要的那個數。這個數在表中的位置,由表首地址、數在表內相對錶首地址的偏移量、一個資料的位元組數等因素來確定。
具體方法是:將表首地址放入dptr中,偏移量放入a中,用查表指令movc a,@a+dptr;來完成從資料區取數。有如下幾種情況:
1、如果資料區的長度不超過256個位元組(累加器a的容量之內),且資料是單位元組的,則不需要另外處理;
2、因為如果資料區的長度不超過256個位元組,但資料是雙位元組的,需要將偏移量乘2,第一次讀出一個位元組儲存,將地址加1後再讀第二位元組(類推:一個資料是n位元組,則偏移量乘n,每次讀出一個位元組儲存,將地址加1後再讀下一位元組,直到一個數全部讀出)。
3、如果資料區的長度超過了256個位元組,因為a已經存放不了256以上的偏移量,此時需要事先將偏移量加入到dptr中去(即資料的真實地址全部放到dptr中了),再將a清零後使用查表指令。同樣也要如上區分單位元組數和多位元組數。
你所給例就是資料區的長度超過了256個位元組,且資料為雙位元組的情況。程式解釋如下,供參考。
mov dptr,#tab ;表首地址入dptr
mov a,r3
clr c
rlc a ;偏移量的低8位乘2在a中,移出的最高位在c中
xch a,r2 ;乘2後的偏移量的低8入r2中,偏移量的高8位入a中
rlc a;偏移量的高8位乘2在a中
xch a,r2 ;偏移量的高低位元組歸位,至此完成了偏移量乘2
add a,dpl
mov dpl,a;
mov a,dph
addc a,r2
mov dph,a;將偏移量加到dptr中,至此dptr中就是資料第一個位元組的實際地址
clr a ;a清零,因為偏移量已經加入,dptr內容不需要再修正。
movc a,@a+dptr;讀資料第一個位元組
mov r2,a;讀資料第一個位元組存入r2中
clr a ;a清零
inc dptr ;地址加“1”,準備讀下一個位元組
movc a,@a+dptr
mov r3,a 讀資料第一個位元組存入r3中
rettab: dw ***xh;tab為表首地址,共1024個雙位元組資料項,共2048個位元組
dw ***xh
......
dw ***xh
51微控制器怎樣從RoM中取指令,微控制器中訪問ROM指令的操作碼是什麼?
這是微控制器工作時,完全是自動完成的,不需要任何的人為的干預,只要上電並復位後,進入工作狀態,就自動從rom中取指令開始執行了。 給你個 裡面有將,你可以看一看 微控制器中訪問rom指令的操作碼是什麼? 51微控制器要訪問rom時的指令操作碼是movc,具體指令有 movc a,a pc 對應的機器...
微控制器加法指令只怎麼執行的,51微控制器的加法指令到底怎麼加啊,例如12A4H 0FE7H
a,30h是將30h記憶體中數加a放到a的儲存單元。84h 8dh,d是13,加4為17,0到15即0到f這16個數,結果為1,進位標誌c為有效,然後加進8 8 c 17,還是保留1並進位,所以最後是11h。psw是微控制器內部標誌暫存器,是微控制器執行必不可少的基本運算基礎,cy是進位標誌,是位元...
51微控制器中ACC怎麼用,51微控制器中ACC怎麼用??
a和acc的實質是一樣的,對應位址都是0e0h,只是彙編在使用時,在格式上取了兩個名字。你看看它們的使用方法,有的地方用a,有的地方用acc,會發現有一定的規律。當其要進行位表示時,必須用acc,比如要寫成acc.7,而不能寫成a.7 但當其作為8位二進位制數時,acc和a都能用 但還是有區別 比如...